Прослушиватель UDP-сокета Eventmachine не получает данные из сети (сначала должен быть запущен данными localhost) - PullRequest
0 голосов
/ 28 декабря 2018

У меня есть два компьютера, подключенных к сети, отправляющих и получающих данные UDP.Отправляющий компьютер - Windows с использованием SocketTest v 3.0.0

Получающий - Macbook с использованием этого кода Ruby для эхо-сервера:

require 'eventmachine'

EM.run do
  puts "EM.run"
  EM.open_datagram_socket '0.0.0.0', 9100 do |server|
    puts "socket open"
    def server.receive_data(data)
      puts "data received: #{data}"
      send_data("sending back: #{data}")
    end
  end
end

Когда я запускаю эту программу и отправляю данные с компьютера Windows, ничегослучается.Но когда я запускаю эту программу на секунду рядом с эхо-сигналом Eventmachine:

require 'socket'

s = UDPSocket.new

while 1 do
  puts "sending..."
  s.send "hi", 0, "localhost", 9100
end

Eventmachine печатает несколько сообщений «hi», как и предполагалось, и с этого момента он также получает данные с компьютера, подключенного к сети (я вижу,«отправка ответа» на компьютер с Windows).

Почему это так?Насколько я понимаю, UDP не имеет соединения, поэтому он должен принимать все данные с данного порта.Как сигнал от "localhost" запускает сокет для прослушивания здесь из сети?

1 Ответ

0 голосов
/ 31 декабря 2018

ОК, поэтому я перестал исследовать это и сделал обходной путь:

require 'eventmachine'
require 'socket'

EM.run do
  puts "EM.run"
  EM.open_datagram_socket '0.0.0.0', 9100 do |server|

    # send first packet from localhost to trigger network receiving (bug on my Macbook)
    s = UDPSocket.new
    s.send Time.now.to_s, 0, "localhost", 9100

    def server.receive_data(data)
      puts data
      send_data("OK")

      # forward data to another UDP port
      s = UDPSocket.new
      s.send data, 0, "localhost", 9101
    end
  end
end

Ужасно, но работает.s вероятно, не следует создавать два раза, но что угодно.Теперь я могу получать сетевые пакеты в каждой программе через порт 9101.

...