【问题标题】:how to bind a TCP socket without listening in nodejs?如何在不监听nodejs的情况下绑定TCP套接字?
【发布时间】:2016-02-10 06:10:33
【问题描述】:

我想在应用程序运行期间保留一个端口,但应用程序不应该一直在监听该端口。因此,我想将bind() 调用与listen() 调用分离。

nodejs 中的 UDP/Datagram 套接字有一个bind 函数。但我在“普通”(TCP)套接字 API 中找不到它的等价物。

可以不听就绑定吗?

【问题讨论】:

  • 为什么?立即收听不会造成任何伤害,只是客户端可以更快地连接。
  • 只听不做

标签: node.js sockets tcp


【解决方案1】:

您可以创建未包装的 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时区分两种socket的能力。

【讨论】:

  • 'Raw TCP socket' 在术语上是矛盾的,这正是 OP 声称的,无论对错,他不想做。
  • “可以不听就绑定吗?”.是的,我正在展示如何(以及如何在稍后阶段收听,因为他想将绑定和收听分离)。对于“原始 TCP 套接字”,我不是指“原始套接字”,而是指未包装的(由节点)套接字。
  • 你必须解释一下。仅仅代码不是答案。调用“listen()”的代码怎么可能不听?
  • @EJP 再次,代码展示了如何将绑定与监听分开。对listen() 的调用确实 侦听,但此时端口已经绑定(由之前执行的socket.bind() 调用)。
  • 所以它应该在你的回答中这么说。不在下面。
猜你喜欢
  • 2016-04-06
  • 1970-01-01
  • 2021-01-25
  • 2011-03-31
  • 1970-01-01
  • 2017-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多