从多个工作进程发送UDP消息

时间:2016-02-06 01:22:06

标签: node.js

在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上看到过这个问题。

1 个答案:

答案 0 :(得分:1)

此行为可能来自netcat。引自this answer

  

当nc正在侦听UDP套接字时,它会“锁定”到它收到的第一个数据包的源端口和源IP。

如果您以不同方式收听消息,则应该全部看到它们。例如:

require('dgram').createSocket('udp4')
  .bind(8111)
  .on('message', function (buf) { console.log(buf.toString()); });