套接字返回’没有这样的文件或目录“

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 clients\n"); } 

在旧式方法中编辑==编码

  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;