Ruby 为什么我没有收到发送到自己IP的UDP数据包?
我编写了这个ruby程序,将UDP数据包发送到端口16800:Ruby 为什么我没有收到发送到自己IP的UDP数据包?,ruby,sockets,udp,Ruby,Sockets,Udp,我编写了这个ruby程序,将UDP数据包发送到端口16800: require 'socket' sock = UDPSocket.new sock.bind("", 47123) sock.send("Hello!", 0, "192.168.0.100", 16800) sock.close 其中192.168.0.100是我自己的ip地址。但是,数据包没有显示在Wireshark中,我的UDP服务器在同一台PC(运行Linux)上的16800端口上侦听时没有收到任何信息 当我把程序稍微
require 'socket'
sock = UDPSocket.new
sock.bind("", 47123)
sock.send("Hello!", 0, "192.168.0.100", 16800)
sock.close
其中192.168.0.100是我自己的ip地址。但是,数据包没有显示在Wireshark中,我的UDP服务器在同一台PC(运行Linux)上的16800端口上侦听时没有收到任何信息
当我把程序稍微重写到
require 'socket'
sock = UDPSocket.new
sock.setsockopt(Socket::SOL_SOCKET, Socket::SO_BROADCAST, true)
sock.bind("", 47123)
sock.send("Hello!", 0, "<broadcast>", 16800)
sock.close
然而,这是从internet的某个地方复制的,在为stackoverflow编辑它时,我发现服务器总是接收发送到127.0.0.1的数据包,但当我将nil更改为“”时,服务器突然也接收到上面发送的数据包。这是ruby套接字实现中的错误吗?您是否尝试发送到“localhost”或“127.0.0.1”?这将直接发送到本地计算机,并有助于进一步诊断问题。UDPSocket.BIND使用主机和端口。尝试将nil更改为您的IP地址。从…起使用
得到你的IP
这里的猜测,但是你可能想考虑这样的事情——当你使用计算机自己的IP时,数据包在物理链路B/C上是不可见的。TCP/IP栈不必把它们推到很远的地方,以使它们到达目的地。它可以在七层堆栈模型(可能是“传输”层?)的更高层将它们从内部转到计算机上我刚刚使用了您的代码,问题是您没有绑定到特定的IP地址。我不知道Linux,但在OSX上存在一个问题,有时默认值会附加到未使用的IP6地址,而不是您期望的接口将服务器上的“”更改为192.168.1.255,并在客户端的绑定中包含“192.168.1.255”,这一切对我来说都很有用:)如果这样的连接应该可以工作,并且您可以使用Wireshark查看包,那么您还应该检查机器上的软件防火墙。如果它阻止了到您想要使用的UDP端口的通信,您仍然可以使用Wireshark查看包 我认为这只是Windows的一个问题,而且只有当您尝试在127.0.0.1上嗅探数据包时才会出现。至少以我的经验来看。
require 'socket'
sock = UDPSocket.new
sock.setsockopt(Socket::SOL_SOCKET, Socket::SO_BROADCAST, true)
sock.bind(nil, 16800)
while true
packet = sock.recvfrom(1024)
puts packet
end
require 'socket'
def local_ip
orig, Socket.do_not_reverse_lookup = Socket.do_not_reverse_lookup, true # turn off reverse DNS resolution temporarily
UDPSocket.open do |s|
s.connect '64.233.187.99', 1
s.addr.last
end
ensure
Socket.do_not_reverse_lookup = orig
end