绑定错误 - 套接字编程

时间:2013-06-20 14:09:05

标签: c windows sockets

我在绑定套接字时遇到问题。没有这样的错误,不确定为什么如果条件失败。

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))给了我:“没有错误”。但是如果条件并且没有绑定它仍然会失败。

任何帮助?

1 个答案:

答案 0 :(得分:1)

10014是WSAEFAULTbind()在以下时间返回:

  

系统在尝试使用调用中的指针参数时检测到无效指针地址。

     

如果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。