C++ UDP RecvFrom, SendTo Different Sockets

C++ UDP RecvFrom, SendTo Different Sockets

本文关键字:Different Sockets SendTo UDP RecvFrom C++      更新时间:2023-10-16

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

方案: 1 个接收器螺纹 (多个工作线程,每个都有自己的套接字,而不是绑定,只是创建了 IPv4、UDP、数据报) 消息被推送到 1 个工作线程,然后继续它,然后发送带有自己的套接字的 ansare 。

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

混乱: 如果我使用与在服务器端接收数据相同的套接字进行发送,则可以正常工作。我不明白为什么,udp 是一种无连接协议,那么它如何检测不同的套接字?

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

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

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

相关文章: