我正在编写一个简单的客户端-服务器应用程序,暂时供我个人使用。我正在使用 Winsock 进行网络通信。在过去的 10 年里我没有做过任何网络,所以我很生疏。我想尽量少用外部代码,所以我自己写了一个服务器发现机制,如下。
客户端广播一条消息,其中包含绑定到任意端口的客户端 UDP 套接字的“名称”,我将其称为客户端的发现套接字。服务器 recv() 广播,然后 sendto() 客户端发现套接字其侦听套接字的“名称”。客户端然后使用此信息连接到服务器(在不同的套接字上)。这种机制应该允许服务器将其侦听套接字绑定到动态端口范围(49152-65535)内它可以绑定的第一个端口,并允许客户端发现服务器在哪里以及它正在侦听哪个端口。
服务器部分工作正常:服务器接收到广播消息并成功发送响应。
在客户端,防火墙日志显示服务器的响应到达了机器并且它被寻址到正确的端口(到客户端的发现套接字)。但是消息永远不会到达客户端应用程序。我试过在阻塞和非阻塞模式下做一个 recv() ,但从来没有任何数据可用。ioctlsocket() 总是显示没有可用的数据,即使我知道数据包已将其发送到机器。
服务器成功地对广播数据执行 recv()。但是客户端在执行服务器响应的 recv() 时失败,该响应被寻址到其发现套接字。
这个问题非常模糊:在这种情况下我应该注意什么问题?为什么 recv() 无法获得实际到达机器的数据包?套接字是 UDP,因此它们未连接的事实是无关紧要的。或者是吗?
提前谢谢了。