我按照以下方案编写了一个多线程UDP服务器:
方案: 1个接收器线程 (多个工作线程,每个都有自己的Socket,而不是bindend,只是创建了Ipv4,UDP,数据报) 消息被推送给1个工作人员然后继续发送它然后发送一个带有自己套接字的应答。
问题: 这完全适用于我自己的所有测试程序,但由于一些奇怪的原因,它无法使用旧软件来模拟服务器。该软件使用异步Wsa(重叠),但我仍然不知道它为什么不起作用。
混乱: 如果我使用相同的套接字发送,就像我在服务器端接收数据一样。我不明白为什么,udp是一个无连接协议,所以它如何检测不同的套接字?
答案 0 :(得分:1)
混乱:如果我使用相同的套接字进行发送,它会起作用 在服务器端接收数据。我不明白为什么,udp是一个 无连接协议,那么它如何检测不同的套接字?
如果查看要发送的数据包的UDP标头,您会注意到它们包含“UDP源端口”字段。该字段可以由数据包的接收者(通过recvfrom())检查,以找出发送UDP套接字在发送机器上使用的UDP端口(请注意,这与确定哪个端口的“UDP目标端口”字段不同)数据包应该传送到接收机器上)。在您的情况下,您正在与之通信的程序可能正在查看该字段并根据该字段的值调整其行为。
如果您想知道如果您从未在发送UDP套接字上调用bind(),那么该字段将被设置为什么,答案是操作系统将选择一个可用的UDP端口号来发送(基本上是一个隐式绑定( ))。