我正在编写一个测试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套接字的内容,如果有,我该怎么做才能避免这种情况?
我意识到这一切。我的问题是协议特别允许服务器这样做,只要它在原始地址和端口上联系客户端,因此客户端需要能够接收来自未知的远程地址和端口的回复(这就是为什么我在未连接的套接字上使用WSARecvFrom的原因 - 接受任何回复并了解回复的发送地址)。 – 2011-03-29 05:28:19