C++ UDP RecvFrom、SendTo 不同套接字

C++ UDP RecvFrom, SendTo Different Sockets

我按照以下方案编写了一个多线程UDP服务器:

方案: 1 个接收器线程 (多个工作线程,每个都有自己的套接字,不是绑定端,只是创建了 Ipv4、UDP、数据报) 消息被推送给 1 个工作人员,然后继续处理它,然后用自己的套接字发送一个应答。

问题: 这适用于我自己的所有测试程序,但由于某些奇怪的原因,它不适用于我正在模拟服务器的旧软件。该软件使用异步 Wsa(重叠),但我仍然不明白为什么它不起作用。

困惑: 如果我使用与在服务器端接收数据时使用的套接字相同的套接字进行发送,它就会起作用。我不明白为什么,udp 是一种无连接协议,那么它如何检测到不同的套接字?

Confusion: It works if I use the same socket for sending as i used for receiving the data on the serverside. I dont get why, udp is a connectionless protocol so how can it detect a different socket?

如果您查看所发送数据包的 UDP headers,您会注意到它们包含一个 "UDP Source Port" 字段。数据包的接收方可以检查该字段(通过 recvfrom())以找出发送机器上发送 UDP 套接字使用的 UDP 端口(请注意,这与确定哪个端口的 "UDP Destination Port" 字段不同数据包应该被传送到接收机器上)。在您的情况下,与您通信的程序可能正在查看该字段并根据该字段的值调整其行为。

如果您想知道如果您从未在发送 UDP 套接字上调用 bind() 时该字段将被设置为什么,答案是 OS 将选择一个可用的 UDP 端口号来发送(本质上是一个隐式的 bind())。