0

我正在编写一个简单的客户端-服务器应用程序,暂时供我个人使用。我正在使用 Winsock 进行网络通信。在过去的 10 年里我没有做过任何网络,所以我很生疏。我想尽量少用外部代码,所以我自己写了一个服务器发现机制,如下。

客户端广播一条消息,其中包含绑定到任意端口的客户端 UDP 套接字的“名称”,我将其称为客户端的发现套接字。服务器 recv() 广播,然后 sendto() 客户端发现套接字其侦听套接字的“名称”。客户端然后使用此信息连接到服务器(在不同的套接字上)。这种机制应该允许服务器将其侦听套接字绑定到动态端口范围(49152-65535)内它可以绑定的第一个端口,并允许客户端发现服务器在哪里以及它正在侦听哪个端口。

服务器部分工作正常:服务器接收到广播消息并成功发送响应。

在客户端,防火墙日志显示服务器的响应到达了机器并且它被寻址到正确的端口(到客户端的发现套接字)。但是消息永远不会到达客户端应用程序。我试过在阻塞和非阻塞模式下做一个 recv() ,但从来没有任何数据可用。ioctlsocket() 总是显示没有可用的数据,即使我知道数据包已将其发送到机器。

服务器成功地对广播数据执行 recv()。但是客户端在执行服务器响应的 recv() 时失败,该响应被寻址到其发现套接字。

这个问题非常模糊:在这种情况下我应该注意什么问题?为什么 recv() 无法获得实际到达机器的数据包?套接字是 UDP,因此它们未连接的事实是无关紧要的。或者是吗?

提前谢谢了。

4

2 回答 2

0

客户端广播一条消息,其中包含绑定到任意端口的客户端 UDP 套接字的“名称”,我将其称为客户端的发现套接字。

消息不需要包含任何内容。只需从“发现套接字”广播一条空消息。recvfrom()会告诉服务器它来自哪里,它可以直接回复。

服务器 recv() 广播,然后 sendto() 客户端发现套接字其侦听套接字的“名称”。

很公平,尽管实际上服务器可以每 5 秒或其他时间广播自己的 TCP 侦听端口。

在客户端,防火墙日志显示服务器的响应到达机器并且它被寻址到正确的端口(到客户端的发现套接字)。但是消息永远不会到达客户端应用程序

如果它到达主机,它必须到达应用程序。你一定是把端口弄混了。如上所述简化并重试。

于 2013-02-22T02:09:18.750 回答
0

嗯,这是其中一种愚蠢的情况:Windows 防火墙处于活动状态,除了另一个防火墙,并且默默地丢弃数据包。停用它解决了这个问题。

但我仍然不明白它是如何工作的,因为它允许服务器接收通过广播发送的数据包。当我想尽办法将服务器设置为通过广播回复时,这些数据包被丢弃了。

两天的郁闷。我希望有人从我的经验中受益。

于 2013-02-22T16:19:56.740 回答