mirror of
https://github.com/nodejs/node.git
synced 2024-11-25 08:19:38 +01:00
3e1b1dd4a9
The copyright and license notice is already in the LICENSE file. There is no justifiable reason to also require that it be included in every file, since the individual files are not individually distributed except as part of the entire package.
95 lines
2.1 KiB
JavaScript
95 lines
2.1 KiB
JavaScript
var NUM_WORKERS = 4;
|
|
var PACKETS_PER_WORKER = 10;
|
|
|
|
var assert = require('assert');
|
|
var cluster = require('cluster');
|
|
var common = require('../common');
|
|
var dgram = require('dgram');
|
|
|
|
|
|
if (process.platform === 'win32') {
|
|
console.warn("dgram clustering is currently not supported on windows.");
|
|
process.exit(0);
|
|
}
|
|
|
|
if (cluster.isMaster)
|
|
master();
|
|
else
|
|
worker();
|
|
|
|
|
|
function master() {
|
|
var listening = 0;
|
|
|
|
// Fork 4 workers.
|
|
for (var i = 0; i < NUM_WORKERS; i++)
|
|
cluster.fork();
|
|
|
|
// Wait until all workers are listening.
|
|
cluster.on('listening', function() {
|
|
if (++listening < NUM_WORKERS)
|
|
return;
|
|
|
|
// Start sending messages.
|
|
var buf = new Buffer('hello world');
|
|
var socket = dgram.createSocket('udp4');
|
|
var sent = 0;
|
|
doSend();
|
|
|
|
function doSend() {
|
|
socket.send(buf, 0, buf.length, common.PORT, '127.0.0.1', afterSend);
|
|
}
|
|
|
|
function afterSend() {
|
|
sent++;
|
|
if (sent < NUM_WORKERS * PACKETS_PER_WORKER) {
|
|
doSend();
|
|
} else {
|
|
console.log('master sent %d packets', sent);
|
|
socket.close();
|
|
}
|
|
}
|
|
});
|
|
|
|
// Set up event handlers for every worker. Each worker sends a message when
|
|
// it has received the expected number of packets. After that it disconnects.
|
|
for (var key in cluster.workers) {
|
|
if (cluster.workers.hasOwnProperty(key))
|
|
setupWorker(cluster.workers[key]);
|
|
}
|
|
|
|
function setupWorker(worker) {
|
|
var received = 0;
|
|
|
|
worker.on('message', function(msg) {
|
|
received = msg.received;
|
|
console.log('worker %d received %d packets', worker.id, received);
|
|
});
|
|
|
|
worker.on('disconnect', function() {
|
|
assert(received === PACKETS_PER_WORKER);
|
|
console.log('worker %d disconnected', worker.id);
|
|
});
|
|
}
|
|
}
|
|
|
|
|
|
function worker() {
|
|
var received = 0;
|
|
|
|
// Create udp socket and start listening.
|
|
var socket = dgram.createSocket('udp4');
|
|
|
|
socket.on('message', function(data, info) {
|
|
received++;
|
|
|
|
// Every 10 messages, notify the master.
|
|
if (received == PACKETS_PER_WORKER) {
|
|
process.send({received: received});
|
|
process.disconnect();
|
|
}
|
|
});
|
|
|
|
socket.bind(common.PORT);
|
|
}
|