【问题标题】:Ruby UDP server/client test failsRuby UDP 服务器/客户端测试失败
【发布时间】:2009-11-12 14:20:32
【问题描述】:

我正在尝试使用 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)

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

谁能帮我解决这个问题?

【问题讨论】:

    标签: ruby udp


    【解决方案1】:

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

    @socket.bind('', @port) # '' ==> INADDR_ANY
    

    来自Socket 的文档:

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

    ....

    Socket::AI_PASSIVE: 设置时,如果 host 为 nil,'any' 地址将是 返回,Socket::INADDR_ANY 或 0 IPv4,“0::0”或“::”用于 IPv6。这 地址适合服务器使用 这将绑定他们的套接字并执行 被动听,因此得名 旗帜。否则本地或环回 地址将被返回,这是 “127.0.0.1”用于 IPv4,“::1”用于 IPv6

    【讨论】:

    • 使用 '' 或 Socket::INADDR_ANY 作为绑定方法的 IP 地址可解决问题。谢谢!
    【解决方案2】:

    服务器中的@socket.bind("10.10.129.139", @port) 不工作了吗?

    编辑:

    通常您可以在一台机器上拥有多个网络接口(WLAN、LAN、..)。它们都有不同的 IP 地址,因此您必须将服务器绑定到至少一个主机地址。

    【讨论】:

      猜你喜欢
      • 2020-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-22
      • 2012-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多