【发布时间】:2009-08-25 12:13:35
【问题描述】:
我已经编写了这个 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
但是,这是从互联网的某个地方复制的,在为 stackoverflow 编辑它时,我发现服务器总是收到发送到 127.0.0.1 的数据包,但是当我将 nil 更改为“”时,服务器突然也收到了数据包上面发送的。这是 ruby 套接字实现中的错误吗?
【问题讨论】: