Ruby 应用程序没有收到来自不同主机的 UDP 数据包
Ruby application does not receive UDP packet from different host
使用服务器地址 192.168.1.30 从 Ruby 客户端向 Ruby 服务器发送 UDP 数据包按预期工作,但前提是客户端和服务器位于同一主机上。如果客户端在不同的机器上运行,UDP 数据包会找到到达服务器的路径,但我的服务器进程不会注意到。
服务器:
require 'socket'
sock = UDPSocket.new()
sock.bind('', 8999)
p sock
while true do
p sock.recvfrom(2000)
end
sock.close
客户:
require 'socket'
sock = UDPSocket.new
p sock.send("foo", 0, "192.168.1.30", 8999)
sock.close
启动服务器后,netstat -n --udp --listen
确认套接字已打开:
Proto Recv-Q Send-Q Local Address Foreign Address State
udp 0 0 0.0.0.0:8999 0.0.0.0:*
在 运行 客户端两次(在 192.168.1.30 和 .23 上)之后,服务器输出仅显示一个传入数据包,缺少来自 192.168.1.23 的数据包:
#<UDPSocket:fd 7, AF_INET, 0.0.0.0, 8999>
["foo", ["AF_INET", 52187, "192.168.1.30", "192.168.1.30"]]
而 Wireshark 表示注意到了两个数据包
No Time Source Destination Proto Length Info
1 0.000000000 192.168.1.30 192.168.1.30 UDP 47 52187 → 8999 Len=3
2 2.804243569 192.168.1.23 192.168.1.30 UDP 62 39800 → 8999 Len=3
我可能遗漏了哪些明显的细节?
检查您是否激活了任何防火墙规则:
sudo iptables -L
sudo ufw status
使用服务器地址 192.168.1.30 从 Ruby 客户端向 Ruby 服务器发送 UDP 数据包按预期工作,但前提是客户端和服务器位于同一主机上。如果客户端在不同的机器上运行,UDP 数据包会找到到达服务器的路径,但我的服务器进程不会注意到。
服务器:
require 'socket'
sock = UDPSocket.new()
sock.bind('', 8999)
p sock
while true do
p sock.recvfrom(2000)
end
sock.close
客户:
require 'socket'
sock = UDPSocket.new
p sock.send("foo", 0, "192.168.1.30", 8999)
sock.close
启动服务器后,netstat -n --udp --listen
确认套接字已打开:
Proto Recv-Q Send-Q Local Address Foreign Address State
udp 0 0 0.0.0.0:8999 0.0.0.0:*
在 运行 客户端两次(在 192.168.1.30 和 .23 上)之后,服务器输出仅显示一个传入数据包,缺少来自 192.168.1.23 的数据包:
#<UDPSocket:fd 7, AF_INET, 0.0.0.0, 8999>
["foo", ["AF_INET", 52187, "192.168.1.30", "192.168.1.30"]]
而 Wireshark 表示注意到了两个数据包
No Time Source Destination Proto Length Info
1 0.000000000 192.168.1.30 192.168.1.30 UDP 47 52187 → 8999 Len=3
2 2.804243569 192.168.1.23 192.168.1.30 UDP 62 39800 → 8999 Len=3
我可能遗漏了哪些明显的细节?
检查您是否激活了任何防火墙规则:
sudo iptables -L
sudo ufw status