2009-08-25 64 views
0

我写这个Ruby程序发送一个UDP数据包到端口16800:为什么我没有收到发送到我自己的IP的UDP包?

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 

了数据包在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但是当我改变为“”时,服务器突然也收到上面发送的数据包。这是在ruby套接字实现中的错误吗?

+1

尝试127.0.0.1? – 2009-08-25 12:15:16

回答

0

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

1

UDPSocket.BIND需要一个主机和一个端口。尝试将零修改为您的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

0

一种推测这里,但你可能要考虑这样的事情 - 当你使用计算机自己的IP,数据包不会在物理链路B可见/ c tcp/ip协议栈不需要将它们推到那个位置,就可以将它们转到内部的计算机上,在7层堆栈模型中的更高层之一(“传输'层,也许?)

+0

我认为这只是Windows的问题,并且只有当您试图在127.0.0.1上嗅探数据包时。至少在我的经验。 – MattC 2009-08-25 13:18:26

1

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

更改“”到192.168.1.255的服务器上,并包括“在客户端绑定192.168.1.255”做这些工作对我来说:)

0

如果这样的连接应该工作,并你看到使用Wireshark的软件包,那么你也应该检查你的机器上的软件防火墙。如果它阻塞了要使用的UDP端口的流量,您仍然可以使用Wireshark查看该包。

相关问题