在Node.js中,我在使用来自子进程的dgram时遇到问题。如果我尝试从多个工作进程发送UDP消息,则只会发送来自其中一个进程的消息。
如果你运行下面的代码并运行类似Netcat的东西来监听UDP(nc -ul 8111
),你应该看到只有一个工作人员成功发送UDP消息,即使有多个工作人员登录到控制台。
const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;
const dgram = require('dgram');
function doSocketStuff() {
var socket = dgram.createSocket('udp4');
var workerId = cluster.isMaster ? 'master' : cluster.worker.id;
setInterval(() => {
console.log("Worker " + workerId);
var message = new Buffer("UDP from " + workerId + "\n");
socket.send(message, 0, message.length, 8111, 'localhost');
}, 1000);
}
if (cluster.isMaster) {
for (var i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', (worker, code, signal) => {
console.log(`worker ${worker.process.pid} died`);
});
} else {
doSocketStuff();
}
我在使用Node.js 5.1.0的OSX和使用Node.js 4.2.6的Windows上看到过这个问题。
答案 0 :(得分:1)
此行为可能来自netcat
。引自this answer:
当nc正在侦听UDP套接字时,它会“锁定”到它收到的第一个数据包的源端口和源IP。
如果您以不同方式收听消息,则应该全部看到它们。例如:
require('dgram').createSocket('udp4')
.bind(8111)
.on('message', function (buf) { console.log(buf.toString()); });