没有bind()的UDP客户端不接收数据

时间:2015-01-27 06:34:20

标签: c sockets udp winsock2 udpclient

我从binarytides查看了UDP客户端程序,我能够将UDP数据包发送到UDP服务器,这是我的嵌入式设备,该设备回送UDP消息。

在这个PC-UDP客户端代码中,它应该得到回显的消息,但是我没有回复任何回声。所以我在我的PC上运行了一个UDP服务器,它监听传入的数据并打印出来,我是能够看到来自我的嵌入式设备的回显消息。

当我在代码中的while(1)循环之前添加这些行时,现在我能够看到Echoed返回消息。

 //setup address structure
memset((char *) &si_server, 0, sizeof(si_server));
si_server.sin_family = AF_INET;
si_server.sin_port = htons(PORT);
si_server.sin_addr.S_un.S_addr = INADDR_ANY;

if( bind(s ,(struct sockaddr *)&si_server , sizeof(si_server)) == SOCKET_ERROR)
{
    printf("Bind failed with error code : %d" , WSAGetLastError());
    exit(EXIT_FAILURE);
}
puts("Bind done");

对可能导致此问题的原因有什么想法?

1 个答案:

答案 0 :(得分:7)

您好我终于找到了EJP answer

的答案

只需要绑定()服务器,因为客户端需要一个固定的端口号来发送。客户端根本不需要绑定():使用系统分配的本地端口号在第一个send()/ sendto()/ recv()/ recvfrom()上发生自动绑定()。强>

在wireshark的帮助下,我能够看到我的电脑从端口53701发送数据,并且在第一个发送到()时,这个端口被自动绑定,因此必须进行明确的绑定。