2011-03-28 55 views
1

我正在编写一个测试UDP网络服务的小程序。允许服务的实现为会话创建一个新的套接字并从那里响应客户端,然后客户端需要与此地址对话(类似于TFTP)。WSARecvFrom来自未连接的UDP套接字不返回

最小客户端SANS错误检查看起来是这样的:

int fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); 

sockaddr_in destaddr = { ... }; 
MSGBUF msg[] = { ... }; 
DWORD sent; 
WSASendTo(fd, msg, sizeof msg/sizeof *msg, &sent, 0, (sockaddr *)sa, sizeof sa, 0, 0); 

char buffer[4096]; 
MSGBUF rcvmsg = { sizeof buffer, buffer }; 
DWORD received; 
sockaddr_storage sa; 
socklen_t sa_len = sizeof sa; 
DWORD flags = 0; 
WSARecvFrom(fd, &rcvmsg, 1, &received, &flags, (sockaddr *)&sa, &sa_len, 0, 0); 

客户端工作正常,如果服务器从最初的消息被发送到同一个地址和端口响应,但是从另一个端口答复将被丢弃客户挂在WSARecvFrom

如预期的那样,将套接字显式绑定到{ AF_INET, INADDR_ANY, 0 }以强制分配本地端口,或调用listen(fd, 5);没有任何区别。

WSASendTo中是否有隐式连接UDP套接字的内容,如果有,我该怎么做才能避免这种情况?

回答

0

这是一个防火墙问题。将应用程序添加到允许接收传入流量的程序列表中可以解决问题。

2

UDP没有连接。数据报被发送到端口和从端口发送;这是单向沟通。

这听起来像你的服务器让自己被分配一个临时端口(即传递0作为sockaddr_in中的端口),而不是使用特定的端口。这不起作用。

由于UDP没有连接的概念,每次发送数据时,都可能从不同的端口发送;第一次发送不保留给定的端口,它只是从它发送一个数据报,然后让它离开。

您的服务器应该将自己绑定到特定端口。

+0

我意识到这一切。我的问题是协议特别允许服务器这样做,只要它在原始地址和端口上联系客户端,因此客户端需要能够接收来自未知的远程地址和端口的回复(这就是为什么我在未连接的套接字上使用WSARecvFrom的原因 - 接受任何回复并了解回复的发送地址)。 – 2011-03-29 05:28:19

相关问题