Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 为什么我没有收到发送到自己IP的UDP数据包?_Ruby_Sockets_Udp - Fatal编程技术网

Ruby 为什么我没有收到发送到自己IP的UDP数据包?

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端口上侦听时没有收到任何信息 当我把程序稍微

我编写了这个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.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