recv()在UDP上失败

时间:2013-02-20 15:02:35

标签: udp recv

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

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

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

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

服务器成功对广播数据执行recv()。但客户端无法执行服务器响应的recv(),该响应发送到其发现套接字。

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

非常感谢提前。

2 个答案:

答案 0 :(得分:0)

  

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

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

  

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

很公平,虽然实际上服务器可以每隔5秒或者其他任何方式广播自己的TCP侦听端口。

  

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

如果它到达主机,它必须到达应用程序。你必须以某种方式混淆端口。如上所述简化并重试。

答案 1 :(得分:0)

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

但我仍然不明白它是如何工作的,因为它允许服务器接收通过广播发送的数据包。当我的智慧结束并将服务器设置为通过广播回复时,那些数据包被丢弃。

两天的沮丧。我希望有人从我的经验中获益。