【发布时间】:2016-05-26 18:12:40
【问题描述】:
我有一个调用 connect()、send() 和 recv() 的 UDP 客户端。
服务器有多个 IP 地址。如果来自服务器的回复不是来自与查询相同的 IP,则 recv() 超时。我在别处读到这可能是因为客户端正在调用 connect(),所以它只会接受来自同一 IP 的回复。
有没有办法确保服务器总是从与查询相同的 IP 回复?我希望服务器监听所有接口。
更新:如果客户端没有调用 connect() 并且调用了 sendto() 而不是 send(),那么 recv() 正确地接收到来自服务器的回复。我仍然宁愿通过从查询来自的同一 IP 发送回复来在服务器端修复它。服务器上没有发生路由,它是一个具有多个 IP 的网络接口。
【问题讨论】:
-
请写一个sn-p查看代码。另外我不相信 recv 失败,最多它不会收到任何东西。最后,如果中间有 NAT,我不相信服务器会在一个 IP 地址中接收消息并从不同的 IP 地址发送响应。如果您需要帮助,您应该提供更多详细信息
-
我应该更清楚。 recv() 超时。
-
如果我没记错的话,当传输到服务器时,客户端将通过 udp 包接收的端口号和 ip 建立通信。服务器应该返回相同的端口号。有时防火墙场景可能会导致问题,需要所谓的“udp 打孔”,但它与多客户端问题无关。如果您有多个客户端,则可以查看线程安全编码以将客户端分开。
-
在客户端和服务器上禁用防火墙以进行测试。数据报正在返回给客户端,但由于源 IP 地址不同,recv() 忽略了它。我已经确认,如果客户端不调用 connect() 并调用 sendto() 而不是 send(),则不会出现问题。
标签: sockets network-programming udp