Ruby UDP 服务器/客户端测试失败

Sta*_*ked 0 ruby udp

我正在尝试使用 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
Run Code Online (Sandbox Code Playgroud)

这是客户:

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
Run Code Online (Sandbox Code Playgroud)

现在,我有两台运行 Linux 的 VirtualBox 机器。他们在同一个网络中,可以互相ping通。

但是当我在机器 A 上启动 UDP 服务器,然后尝试在机器 BI 上运行 UDP 客户端时,出现以下错误:

client.rb:13:in `send': Connection refused - sendto(2) (Errno::ECONNREFUSED)
Run Code Online (Sandbox Code Playgroud)

我怀疑错误出在服务器上的bind方法中。我不知道应该在那里指定哪个地址。我在某处读到您应该使用 LAN/WAN 接口的地址,但我不知道如何获取该地址。

谁能帮我解决这个问题吗?

pil*_*row 5

您的主机参数nil被理解为localhost,因此外部计算机将无法连接到该套接字。试试这个:

\n\n
@socket.bind(\'\', @port) # \'\' ==> INADDR_ANY\n
Run Code Online (Sandbox Code Playgroud)\n\n

来自Socket的文档:

\n\n
\n

host 是要为其返回信息的主机名或地址字符串(对于 IPv4 为点分十进制,对于 IPv6 为十六进制字符串)。也允许 nil,其含义取决于标志,请参见下文。

\n\n

....

\n\n

Socket::AI_PASSIVE:设置后,如果主机为零,则\xe2\x80\x98any\xe2\x80\x99 地址将被返回,Socket::INADDR_ANY 或 0 for\n IPv4、“0::0”或“::”表示 IPv6。该地址适合由服务器使用,服务器将绑定其套接字并执行被动侦听,因此是标志的名称。否则,将返回本地或环回地址,对于 IPv4 为“127.0.0.1”,对于 IPv6 为“::1\xe2\x80\x99”

\n
\n