我编写了这个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套接字实现中的错误吗?
答案 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看到该包!