Linux GCC 4.4.2
我正在做一些套接字编程。
但是,当我尝试从套接字函数分配sockfd时,我不断收到此错误。
" Socket operation on non-socket"
非常感谢任何建议,
#if defined(linux) #include /* Socket specific functions and constants */ #include #include #include #include #include #endif #include "server.h" #include "cltsvr_ults.h" /* Listens for a connection on the designated port */ void wait_client() { struct addrinfo add_info, *add_res; int sockfd; /* Load up the address information using getaddrinfo to fill the struct addrinfo */ memset(&add_info, 0, sizeof(add_info)); /* Use either IPv4 or IPv6 */ add_info.ai_family = AF_UNSPEC; add_info.ai_socktype = SOCK_STREAM; /* Fill in my IP address */ add_info.ai_flags = AI_PASSIVE; /* Fill the struct addrinfo */ int32_t status = 0; if(status = getaddrinfo(NULL, "6000", &add_info, &add_res) != 0) { fprintf(stderr, "getaddrinfo [ %s ]n", gai_strerror(status)); return; } if((sockfd = (socket(add_res->ai_family, add_res->ai_socktype, add_res->ai_protocol)) == -1)) { fprintf(stderr, "Socket failed [ %s ]n", strerror(errno)); return; } /* Bind to the port that has been assigned by getaddrinfo() */ if(bind(sockfd, add_res->ai_addr, add_res->ai_addrlen) != 0) { fprintf(stderr, "Bind failed [ %s ]n", strerror(errno)); return; } printf("Listening for clientsn"); }
在旧式方法中编辑==编码
int32_t sockfd = 0; struct sockaddr_in my_addr; memset(&my_addr, 0, sizeof(my_addr)); my_addr.sin_family = AF_INET; my_addr.sin_port = htons(6000); my_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); sockfd = socket(PF_INET, SOCK_STREAM, 0); if(sockfd == -1) { fprintf(stderr, "Socket failed [ %s ]n", strerror(errno)); return; } if(bind(sockfd, (struct sockaddr *) &my_addr, sizeof(my_addr)) == -1) { fprintf(stderr, "Bind failed [ %s ]n", strerror(errno)); return; }
您的主要问题是您在socket()出错时检查错误。 socket()将在出错时返回-1,而在成功时返回0。 你可能会获得一个好的套接字值(2,3等)并将其视为错误。
您为代码括起来的方式还存在第二个问题。 当你写:
if (sockfd = socket(add_res->ai_family, add_res->ai_socktype, add_res->ai_protocol) != 0)
这被视为:
if (sockfd = (socket(add_res->ai_family, add_res->ai_socktype, add_res->ai_protocol) != 0))
所以sockfd不会被分配socket的返回值,而是将它与0进行比较的值。修复这两个问题,你应该写:
if ((sockfd = socket(add_res->ai_family, add_res->ai_socktype, add_res->ai_protocol)) == -1)
我相信你应该指定你想要的套接字类型。 当你说:
add_info.ai_family = AF_UNSPEC;
你应该说:
add_info.ai_family = AF_INET;
以上就是c/c++开发分享套接字返回’没有这样的文件或目录“相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/544775.html