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

时间:2009-08-25 12:13:36

标签: 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中,而我在同一台PC(运行Linux)上的端口16800上侦听的UDP服务器没有收到任何内容。

当我稍微改写程序

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

数据包确实显示在Wireshark中,但我的服务器仍然没有收到任何内容。

我错过了一些明显的东西吗?

编辑: 服务器代码,为了完整性

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

然而,这是从互联网上的某处复制的,在编辑堆栈溢出时,我发现服务器总是接收发送到127.0.0.1的数据包但是当我将nil更改为“”时,服务器突然也收到数据包上面发送。这是ruby套接字实现中的错误吗?

5 个答案:

答案 0 :(得分:1)

UDPSocket.BIND接受主机和端口。尝试将nil更改为您的IP地址。来自http://coderrr.wordpress.com/2008/05/28/get-your-local-ip-address/;使用

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

获取您的IP

答案 1 :(得分:1)

我刚刚使用了您的代码,问题是您没有绑定到特定的IP地址。我不知道Linux,但在OS X上有一个问题,有时默认会附加到一个未使用的IP6地址而不是你期望的接口。

在服务器上将“”更改为192.168.1.255,并在客户端的绑定中包含“192.168.1.255”,这一切对我有用:)

答案 2 :(得分:0)

您是否尝试过发送到“localhost”或“127.0.0.1”?这将直接发送到本地计算机,将有助于进一步诊断问题。

答案 3 :(得分:0)

这里有一种推测,但你可能想要考虑这样的事情 - 当你使用计算机自己的IP时,数据包在物理链路上是不可见的b / c tcp / ip stack不必推送他们可以将它们带到目前为止的位置,它可以将它们内部转移到计算机中的七层堆栈模型中的较高层之一(也许是“传输”层?)

答案 4 :(得分:0)

如果这样的连接应该可以工作,并且您使用Wireshark看到包,那么您还应该检查计算机上的软件防火墙。如果它阻止您想要使用的UDP端口的流量,您仍然可以使用Wireshark看到该包!