我正在尝试使用Ruby设置一个简单的UDP客户端和服务器。代码如下所示:
require 'socket.so'
class UDPServer
def initialize(port)
@port = port
end
def start
@socket = UDPSocket.new
@socket.bind(nil, @port) # is nil OK here?
while true
packet = @socket.recvfrom(1024)
puts packet
end
end
end
server = UDPServer.new(4321)
server.start
这是客户:
require 'socket.so'
class UDPClient
def initialize(host, port)
@host = host
@port = port
end
def start
@socket = UDPSocket.open
@socket.connect(@host, @port)
while true
@socket.send("otiro", 0, @host, @port)
sleep 2
end
end
end
client = UDPClient.new("10.10.129.139", 4321) # 10.10.129.139 is the IP of UDP server
client.start
现在,我有两台运行Linux的VirtualBox机器。他们在同一个网络中,可以互相ping。
但是当我在机器A上启动UDP服务器,然后尝试在机器B上运行UDP客户端时,我收到以下错误:
client.rb:13:in `send': Connection refused - sendto(2) (Errno::ECONNREFUSED)
我怀疑错误发生在服务器上的bind方法中。我不知道我应该在那里指定哪个地址。我在某处读到你应该使用你的LAN / WAN接口的地址,但我不知道如何获得该地址。
任何人都可以帮我这个吗?
答案 0 :(得分:4)
您的主机参数nil
被理解为 localhost ,因此外部计算机将无法连接到该套接字。试试这个:
@socket.bind('', @port) # '' ==> INADDR_ANY
来自Socket的文档:
host是主机名或地址字符串(IPv4的点分十进制或a IPv6的十六进制字符串) 返回信息。一个零也是 允许,其含义取决于旗帜, 见下文。
...
Socket :: AI_PASSIVE:设置后,如果host为nil,则“any”地址为 返回,Socket :: INADDR_ANY或0表示 IPv4,“0 :: 0”或“::”用于IPv6。这个 地址适合服务器使用 这将绑定他们的套接字并做一个 被动听,因而得名 旗。否则本地或环回 地址将被退回,这是 IPv4为“127.0.0.1”,“:: 1”为 IPv6的
答案 1 :(得分:0)
服务器中的@socket.bind("10.10.129.139", @port)
无效吗?
编辑:
通常,您可以在一台计算机上拥有多个网络接口(WLAN,LAN,..)。它们都有不同的IP地址,因此您必须将服务器绑定到至少一个主机地址。