我在绑定套接字时遇到问题。没有这样的错误,不确定为什么如果条件失败。
int result = WSAStartup(MAKEWORD(2,2), &wsadata);
if(result != NO_ERROR)
{
printf("\nThere is a problem at WSAStartup");
}
else
{
printf("\nWSAStartup was ok");
}
list_sock = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP);
if(list_sock == -1)
{
printf("\n Socket not created %d\n", list_sock);
}
else
{
printf("\nSocket was created Succesfully");
}
HOSTENT *thishost;
char *ip;
u_short port;
port = 55555;
thishost = gethostbyname("localhost");
printf("\n");
printf("\nHost name is:%s ",thishost->h_name);
ip = inet_ntoa(*(struct in_addr*)*thishost->h_addr_list);
printf("\nip address is %s\n ", ip);
printf("Address type is:%i",thishost->h_addrtype);
service.sin_family = AF_INET;
service.sin_addr.s_addr = inet_addr(ip);
service.sin_port = htons(port);
if(bind(list_sock,(SOCKADDR *)&service,sizeof(service))== SOCKET_ERROR)
{
printf("Error during bind %s", strerror(errno));
}
else
{
printf("All done");
}
WSACleanup();
return 0;
我在第
行收到错误if(bind(list_sock,(SOCKADDR *)&service,sizeof(service))== SOCKET_ERROR)
但是strerror(errno))
给了我:“没有错误”。但是如果条件并且没有绑定它仍然会失败。
任何帮助?
答案 0 :(得分:1)
10014是WSAEFAULT
,bind()
在以下时间返回:
系统在尝试使用调用中的指针参数时检测到无效指针地址。
如果name参数为NULL,name或namelen参数不是用户地址空间的有效部分,namelen参数太小,name参数包含关联地址系列的错误地址格式,则返回此错误或由name指定的内存块的前两个字节与与套接字描述符s 关联的地址系列不匹配。
您正在创建IPv6套接字(AF_INET6),但您尝试将其绑定到IPv4(AF_INET)地址。那样不行。您需要创建IPv4套接字,或绑定到IPv6地址,具体取决于您要完成的任务。
最后,请勿使用gethostbyname("localhost")
。首先,它只支持IPv4。其次,如果要绑定到环回IP,请显式绑定到127.0.0.1
(IPv4)或::1
(IPv6),您可以对其进行硬编码或至少使用INETADDR_SETLOOPBACK()
宏在mstcpip.h中。如果要绑定到所有可用IP,请绑定到INADDR_ANY
(IPv4)或IN6ADDR_ANY
(IPv6),您可以对其进行硬编码或至少使用mstcpip中的INETADDR_SETANY()
宏。 H。如果您确实想使用函数调用,请改用getaddrinfo()
,它同时支持IPv4和IPv6。