Windows 10上的奇怪UDP问题

时间:2018-05-23 19:05:47

标签: windows-10 sockets udp

我在Windows 10上遇到一个非常奇怪的问题。在同一个本地网络接口上从一个UDP套接字发送到另一个UDP套接字不起作用。

  • 发送到相同的UDP套接字按预期工作
  • 向/从另一台机器发送按预期工作
  • 如果我使用环回接口(127.0.0.1),它会按预期工作
  • 我尝试了几个接口(从接口发送到自身),甚至在同一个接口上的不同地址 - 似乎没什么用。
  • 这在Windows 7和Linux上按预期工作。
  • 端口绑定成功。

几天前工作正常,我不知道是什么打破了它。

以下ruby脚本演示了此问题:

#!/usr/bin/env ruby

require 'socket'

addr = IPSocket.getaddress(Socket.gethostname)
u1 = UDPSocket.new
u1.bind(addr, 5010)
u2 = UDPSocket.new
u2.bind(addr, 5020)
u1.send('abcd', 0, addr, 5010)
p u1.recvfrom(4) # Works
u1.send('abcd', 0, addr, 5020)
p u2.recvfrom(4) # Fails

1 个答案:

答案 0 :(得分:0)

可能导致上述代码失败的一件事是,如果在此计算机上的端口5020上还有其他东西正在侦听UDP数据包,而另一个UDP接收器会吸收您的数据包而u2永远不会收到它。

但我的下一个想法是,那么你的bind()首先应该失败,但是有一些套接字选项可以让它失败并允许多个服务器在同一个端口上侦听。在这种情况下,随机哪个套接字接收哪个数据包。这可以解释你所看到的。

我必须承认我不确定{10}的bind()的确切语义是什么,以及当多个UDP服务器在同一端口上侦听时的确切行为(以及在Windows 10上是否可以这样做)全部)。

bind()的典型“Windows”语义是:绑定到非零IP地址时,绑定到此IP地址所属的网络接口。 (在Linux上,它意味着:在绑定到所有网络接口时,过滤所有传入数据包以获取该非零IP地址的目标地址。)