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

时间:2009-11-12 14:20:33

标签: 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

这是客户:

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接口的地址,但我不知道如何获得该地址。

任何人都可以帮我这个吗?

2 个答案:

答案 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地址,因此您必须将服务器绑定到至少一个主机地址。