Git   发布时间:2022-04-04  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了bind()失败,出现Windows套接字错误10049大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

我尝试使用IPv6和UDP在C中创build客户端/服务器程序。 当程序绑定套接字时,它将返回WSAError 10049.我知道这是地址名称的问题,但是没有看到问题是什么。 我希望有人能帮帮忙。

struct sockaddr_in6 server,client; SOCKET sock; char buffer[BUFFERSIZE]; LPTSTR recvBuff[1024]; DWORD recvBuffLen = 1024UL; int len = sizeof(client); WORD wVersionrequested; WSADATA wsaData; wVersionrequested = MAKEWORD(1,1); WSAStartup(wVersionrequested,&wsaData); sock = socket(AF_INET6,SOCK_DGRAM,0); if (sock < 0) error("Fehler beim Anlegen des Sockets"); server.sin6_family = AF_INET6; server.sin6_port = htons(6000); server.sin6_addr = in6addr_any; if (bind(sock,(struct sockaddr *) &server,sizeof(server)) == -1) error("Fehler beim binden des Sockets");

套接字,TCP状态和写入系统调用

在窗户上使用SELEct()和STDIN?

从C ++应用程序启动Linux服务时避免套接字inheritance

有关accept()在C(Linux)套接字服务器客户端编程问题

在Linux下读取具有特定VLAN标记的802.1Q帧

这通常是由于尝试绑定到对本地计算机无效的地址所致。 。

你应该在这里使用PF_INET而不是AF_INET 。 它们具有相同的值,但是您并没有在这里指定地址族AF ,而是指定了一个协议族PF 。 这只是一个风格建议。

我会建议memset零下面的数组,结构:

struct sockaddr_in6 server,client; SOCKET sock; char buffer[BUFFERSIZE]; LPTSTR recvBuff[1024];

在你使用sockaddr_in6结构体之前,你必须将它设置为零:

@H_766_0@memset(server,sizeof(struct sockaddr_in6));

原因是struct sockaddr_in6结构包含其他你没有初始化的字段(比如sin6_scope_id ),它可能包含垃圾

在Windows下调用bind()时,我有相同的错误代码

我的理由和最初的海报代码不一样,但我想其他人会犯同样的错误

生成了本地地址,我希望使用inet_addr()函数在本地绑定服务器。 我把这个结果分配给本地地址结构struct sockaddr_in localaddr这样:

localaddr.sin_addr.s_addr = htonl(inaddr);

但是inet_addr()已经以字节网络顺序返回地址,所以调用htonl(inaddr)在我的代码中是错误的,并导致错误10049:

SOCKET tcpsock_bindlisten(unsigned short port,const char* bindaddr) { SOCKET srvsock = socket(PF_INET,SOCK_STREAM,IPPROTO_TCp); unsigned long inaddr = bindaddr ? inet_addr(bindaddr) : INADDR_ANY; struct sockaddr_in localaddr; memset(&localaddr,sizeof(struct sockaddr_in)); localaddr.sin_family = AF_INET; localaddr.sin_port = htons(port); // ERROR HERE! address returned from inet_addr is already in network-byte-order! localaddr.sin_addr.s_addr = htonl(inaddr); // CORRECT THIS WAY: localaddr.sin_addr.s_addr = inaddr; if (bind(srvsock,(struct sockaddr *) &localaddr,sizeof(localaddr)) != 0) { print_socketerror("tcpsock bind()"); return INVALID_SOCKET; } if (listen(srvsock,SVRSOCK_BACKLOG) != 0) { print_socketerror("tcpsock listen()"); return INVALID_SOCKET; } return srvsock; }

使用“所有本地接口”( INADDR_ANY )调用bind()它工作,因为这个巧合INADDR_ANY == htonl(INADDR_ANY) :

int main() { ... // this works for this special case: SOCKET svrsock1 = tcpsock_bindlisten(4444,null); // did not work! SOCKET svrsock2 = tcpsock_bindlisten(5555,"192.168.0.123"); }

我遇到了同样的错误

@askMish的回答是相当正确的。我一开始并不理解,但最终我发现了它。

这通常是由于试图绑定到一个对本地计算机无效的地址造成的。

通常情况下,我们的电脑在某个网关下。

如果我们运行ipconfig我们会发现IP地址是192.168@L_606_30@mething。

这就是我们可以用来在代码中绑定的IP。

当其他人应该连接公共IP(如果你可以上网,你肯定有一个),就像47.93@L_606_30@mething,如果他们在你的同一局域网。

你需要在你的网关找到这个IP(可能是你家的路线)。

大佬总结

以上是大佬教程为你收集整理的bind()失败,出现Windows套接字错误10049全部内容,希望文章能够帮你解决bind()失败,出现Windows套接字错误10049所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: