【发布时间】:2011-03-28 17:48:59
【问题描述】:
我正在编写一个测试 UDP 网络服务的小程序。允许服务的实现为会话创建一个新的套接字并从那里响应客户端,此时客户端需要与该地址通信(类似于 TFTP)。
最小客户端无错误检查如下所示:
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 套接字的内容,如果有,我应该怎么做才能避免这种情况?
【问题讨论】: