Eventmachine UDP套接字侦听器无法从网络接收数据(需要先由localhost数据“触发”)

时间:2018-12-27 23:16:38

标签: ruby sockets udp eventmachine

我有两台联网的计算机,用于发送和接收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 echo旁边运行该程序一秒钟时:

require 'socket'

s = UDPSocket.new

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

Eventmachine按预期打印一些“ hi”消息,并且从现在开始,它还正确地从联网计算机接收数据(我在Windows计算机上看到“发送回”响应)。

那是为什么?我的理解是UDP是无连接的,因此它应该从给定的端口获取所有内容。来自“ localhost”的信号如何触发套接字从此处进行网络侦听?

1 个答案:

答案 0 :(得分:0)

好的,所以我放弃了对此进行调查并采取了解决方法:

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上的每个程序中接收网络数据包了。