【问题标题】:Sending UDP messages from multiple worker processes从多个工作进程发送 UDP 消息
【发布时间】:2016-02-06 01:22:06
【问题描述】:

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

【问题讨论】:

    标签: node.js


    【解决方案1】:

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

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

    如果您以不同的方式收听您的信息,您应该会看到所有信息。例如:

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

    【讨论】:

    • 谢谢!根据自述文件,netcat 似乎有不明显的行为,但我对 UDP 的低级编程知之甚少。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-14
    • 2012-06-05
    • 2013-02-07
    • 1970-01-01
    • 2014-10-08
    相关资源
    最近更新 更多