代码之家  ›  专栏  ›  技术社区  ›  StackedCrooked

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

  •  0
  • StackedCrooked  · 技术社区  · 15 年前

    我正在尝试使用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的虚拟机。他们在同一个网络中,可以互相ping。

    但是,当我在计算机A上启动UDP服务器,然后尝试在计算机B上运行UDP客户端时,我得到以下错误:

    client.rb:13:in `send': Connection refused - sendto(2) (Errno::ECONNREFUSED)
    

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

    有人能帮我做这个吗?

    2 回复  |  直到 15 年前
        1
  •  4
  •   pilcrow    15 年前

    您的主机参数 nil 被理解为 本地服务器 因此,外部机器将无法连接到该插座。试试这个:

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

    从文档中 Socket :

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

    socket::ai_passive:设置时,如果主机为零,则任何_ 返回,socket::inaddr_any或0用于 ipv6的ipv4,“0::0”或“::”。这个 地址适合服务器使用 那会绑住他们的插座 被动倾听,因此 旗帜。否则本地或环回 地址将被返回,这是 “127.0.0.1”用于IPv4,“:1_ IPv6

        2
  •  0
  •   Juri Glass    15 年前

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

    编辑:

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