我正在通过使用node.js绑定到特定端口和地址来侦听UDP消息:
var dgram = require('dgram');
var socket = dgram.createSocket('udp4');
var messageNumber = 0;
socket.on('message', function(data) {
console.log('MESSAGE ' + (++messageNumber));
});
socket.bind(4353, '127.0.0.1');
上面的代码能够接收消息,我通过以下发件人代码检查:
var dgram = require('dgram');
var socket = dgram.createSocket('udp4');
var address = '127.0.0.1';
setInterval(function() {
socket.send(new Buffer('hello'), 0, 5, 4353, address);
}, 1000);
现在我正在启动另一个接收器,而第一个接收器仍在运行(使用上面相同的代码)。我期待以下之一:
根据以下讨论,第一个选项是正确的假设node.js默认情况下不使用SO_REUSEPORT: Let two UDP-servers listen on the same port?
然而,发生的事情是它没有失败,只有最后一个接收者获得发送者的消息。如果我关闭最后一个接收器,第一个接收器就会再次开始接收消息。
这里发生了什么?
编辑:似乎机器之间存在差异。在Ubuntu机器上,我得到了上述现象。在Windows机器上,我得到FIRST接收器获取发送者的消息(并且当关闭该接收器时,另一个接收器开始接收消息)。两种情况的共同点是只有一个接收者接收消息而另一个没有关于端口正在使用的指示(既不是异常也不是错误 - 我也尝试过注册“错误”事件)。