我在Windows 10上遇到一个非常奇怪的问题。在同一个本地网络接口上从一个UDP套接字发送到另一个UDP套接字不起作用。
几天前工作正常,我不知道是什么打破了它。
以下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
答案 0 :(得分:0)
可能导致上述代码失败的一件事是,如果在此计算机上的端口5020上还有其他东西正在侦听UDP数据包,而另一个UDP接收器会吸收您的数据包而u2
永远不会收到它。
但我的下一个想法是,那么你的bind()
首先应该失败,但是有一些套接字选项可以让它失败并允许多个服务器在同一个端口上侦听。在这种情况下,随机哪个套接字接收哪个数据包。这可以解释你所看到的。
我必须承认我不确定{10}的bind()
的确切语义是什么,以及当多个UDP服务器在同一端口上侦听时的确切行为(以及在Windows 10上是否可以这样做)全部)。
bind()的典型“Windows”语义是:绑定到非零IP地址时,绑定到此IP地址所属的网络接口。 (在Linux上,它意味着:在绑定到所有网络接口时,过滤所有传入数据包以获取该非零IP地址的目标地址。)