Eventmachine UDP 套接字监听器不从网络接收数据(需要先 "triggered" by localhost 数据)

Eventmachine UDP socket listener does not receive data from network (needs to be "triggered" by localhost data first)

我有两台联网的计算机发送和接收 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 计算机上看到 "sending back" 响应)。

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

好的,所以我放弃了调查这个问题并做了一个解决方法:

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