类似地,sendHandle 参数可用于将 socket 的句柄传给子进程。
以下示例衍生了两个子进程,分别用于处理 “normal” 连接或优先处理 “special” 连接:
const { fork } = require('child_process');const normal = fork('subprocess.js', ['normal']);const special = fork('subprocess.js', ['special']);// 开启 server,并发送 socket 给子进程。// 使用 `pauseOnConnect` 防止 socket 在被发送到子进程之前被读取。const server = require('net').createServer({ pauseOnConnect: true });server.on('connection', (socket) => {// 特殊优先级。if (socket.remoteAddress === '74.125.127.100') {special.send('socket', socket);return;}// 普通优先级。normal.send('socket', socket);});server.listen(1337);
subprocess.js 会接收该 socket 句柄作为传给事件回调函数的第二个参数:
process.on('message', (m, socket) => {if (m === 'socket') {if (socket) {// 检查客户端 socket 是否存在。// socket 在被发送与被子进程接收这段时间内可被关闭。socket.end(`请求使用 ${process.argv[2]} 优先级处理`);}}});
不要使用已被传给子进程的 socket 上的 .maxConnections。
父进程无法追踪 socket 何时被销毁。
子进程中的任何 'message' 句柄都应该验证 socket 是否存在,因为连接可能会在它发送给子进程的这段时间内被关闭。
