如何在nodejs中不监听的情况下绑定TCP套接字?

HRJ*_*HRJ 3 sockets tcp node.js

我想在应用程序运行期间保留一个端口,但应用程序不应始终侦听该端口。因此我想将bind()呼叫与listen()呼叫解耦。

Nodejs中的UDP/Datagram套接字有一个bind功能。但我在“普通”(TCP)套接字 API 中找不到它的等效项。

是否可以不监听就绑定?

rob*_*lep 5

您可以创建未包装的 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);
Run Code Online (Sandbox Code Playgroud)

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

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

区别在于使用时能够区分两种类型的socket async_hooks