繁体   English   中英

绑定错误-套接字编程

[英]Binding error - Socket programming

绑定套接字时出现问题。 这样就没有错误,不确定为什么if条件失败。

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

有什么帮助吗?

10014是WSAEFAULT ,在以下情况下, bind()返回:

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

返回此错误如果名称参数为NULL,名称或namelen参数不是用户地址空间的有效组成部分,namelen参数太小,名称参数包含相关地址系列的不正确地址格式, 或由名称指定的存储块的前两个字节与与套接字描述符s关联的地址族不匹配

您正在创建一个IPv6套接字(AF_INET6),但是您正在尝试将其绑定到IPv4(AF_INET)地址。 那不管用。 您需要创建IPv4套接字,或者绑定到IPv6地址,具体取决于您要完成的工作。

最后,不要使用gethostbyname("localhost") 首先,它仅支持IPv4。 其次,如果要绑定到回送IP,请显式绑定到127.0.0.1 (IPv4)或::1 (IPv6),您可以对其进行硬编码或至少使用INETADDR_SETLOOPBACK()宏。 如果要绑定到所有可用IP,请绑定到INADDR_ANY (IPv4)或IN6ADDR_ANY (IPv6),您可以对其进行硬编码或至少使用INETADDR_SETANY()宏。 如果您确实要使用函数调用,请改用同时支持IPv4和IPv6的getaddrinfo()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM