如何在没有侦听nodejs的情况下绑定TCP套接字?

时间:2016-02-10 06:10:34

标签: node.js sockets tcp

我想在应用程序的持续时间内保留一个端口,但是应用程序不应该一直在监听端口。因此,我希望将bind()来电与listen()来电解除。

nodejs中的UDP / Datagram套接字具有bind功能。但是我在“普通”(TCP)套接字API中找不到它的等价物。

是否可以在不收听的情况下进行绑定?

1 个答案:

答案 0 :(得分:3)

您可以创建未打包的TCP套接字:

const net    = require('net');
const TCP    = process.binding('tcp_wrap').TCP;
const socket = new TCP();

// Bind is done here.
socket.bind('0.0.0.0', 3333);

console.log('bound');

// Then, at some later stage, if you want to listen,
// you can use the previously created (and bound) socket.
setTimeout(() => {
  console.log('listening');
  const server = net.createServer((conn) => {
    console.log('got connection');
    conn.end('bye\n');
  }).listen(socket);
}, 5000);

编辑:要在Node v9.3.0及更高版本上实例化套接字,您需要将额外的参数传递给构造函数:

const TCPWrap = process.binding('tcp_wrap');
const { TCP } = TCPWrap;
const socket  = new TCP(TCPWrap.constants.SERVER); // or .SOCKET

区别在于使用async_hooks时能够区分两种类型的套接字。