Тест сервера Ruby UDP / клиента не пройден - PullRequest
0 голосов
/ 12 ноября 2009

Я пытаюсь настроить простой UDP-клиент и сервер, используя Ruby. Код выглядит так:

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

Теперь у меня есть две машины VirtualBox под управлением Linux. Они находятся в одной сети, они могут пинговать друг друга.

Но когда я запускаю UDP-сервер на машине A, а затем пытаюсь запустить UDP-клиент на машине B, я получаю следующую ошибку:

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

Я подозреваю, что ошибка в методе bind на сервере. Я не знаю, какой адрес я должен указать там. Я где-то читал, что вы должны использовать адрес вашего интерфейса LAN / WAN, но я не знаю, как получить этот адрес.

Может кто-нибудь помочь мне с этим?

Ответы [ 2 ]

4 голосов
/ 12 ноября 2009

Ваш параметр хоста nil понимается как localhost , поэтому внешняя машина не сможет подключиться к этому сокету. Попробуйте вместо этого:

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

Из документов на Розетка :

host - имя хоста или строка адреса (десятичная точка в IPv4 или шестнадцатеричная строка для IPv6) для которой вернуть информацию. Ноль также разрешено, его значение зависит от флагов, см. ниже.

....

Socket :: AI_PASSIVE: если установлено, если хост равен нулю, «любой» адрес будет возвращается, Socket :: INADDR_ANY или 0 для IPv4, "0 :: 0" или "::" для IPv6. это адрес подходит для использования серверами который свяжет их сокет и сделает пассивное слушание, таким образом, имя флаг. В противном случае местный или петлевой адрес будет возвращен, это «127.0.0.1» для IPv4 и «:: 1» для IPv6

0 голосов
/ 12 ноября 2009

Не работает ли @socket.bind("10.10.129.139", @port) на сервере?

Edit:

Обычно на одной машине может быть несколько сетевых интерфейсов (WLAN, LAN, ...). Все они имеют разные IP-адреса, поэтому вам необходимо привязать сервер хотя бы к одному адресу хоста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...