我有两台联网的计算机,用于发送和接收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”的信号如何触发套接字从此处进行网络侦听?
答案 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上的每个程序中接收网络数据包了。