【问题标题】:Do you have to close a UDP (dgram) client in Node.js or can you reuse it?您是否必须在 Node.js 中关闭 UDP (dgram) 客户端,还是可以重用它?
【发布时间】:2012-06-18 10:43:24
【问题描述】:

The docs(以及我看过的许多库)似乎表明您每次发送时都会关闭客户端:

var dgram = require('dgram');
var message = new Buffer("Some bytes");
var client = dgram.createSocket("udp4");
client.send(message, 0, message.length, 41234, "localhost", function(err, bytes) {
  client.close();
});

老实说,我对 UDP 的内部工作原理了解不多,但是每次要发送 UDP 数据包时,什么会阻止您仅重用 client?你close()了吗?

我已经在localhost 上对其进行了测试(即重用客户端),它可以很好地发送多个数据包(至少到同一个目的地),但这还不足以让我确信它会在广阔的世界中一切安好。

The source of send() 调用 _startReceiving() 函数,该函数“绑定到随机端口”,然后“开始接收” - 但我不清楚这里应该接收什么,因为我们实际上是在发送。无论如何,这足以让我认为留住客户可能存在问题......我只是不确定它们是什么。

【问题讨论】:

    标签: node.js udp datagram


    【解决方案1】:

    您可以为多个请求重用一个 udp 套接字。例如,在多个测试中也可以看到这种行为: https://github.com/joyent/node/blob/master/test/simple/test-dgram-pingpong.js

    udp 套接字绑定到一个随机端口,因为它必须使用端口指定源地址。

    【讨论】:

    • 在测试代码上很好的发现!那么什么时候需要“关闭”呢?即使您发送到不同的主机/端口,您能否保持打开状态?您能否只为您的整个应用程序打开一个“客户端”?
    • 到目前为止,我还没有显式关闭客户端/套接字,并且能够很好地重用它,所以我认为这个答案是正确的
    • 您好,您在使用节点集群时关闭 udp 连接时是否遇到过 100% cpu 的问题? github.com/joyent/node/issues/7590
    【解决方案2】:

    有3种情况需要关闭UDP套接字:

    1. 您将创建另一个绑定到same 本地端口的套接字,从而避免port in use 问题。
    2. 您的对等方正在使用您的本地端口进行响应,而您不再需要这些响应。
    3. 您的对等方正在使用您的本地端口作为标识符,而您不再希望与其关联。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-01
      • 2017-03-11
      • 2011-01-05
      • 1970-01-01
      • 1970-01-01
      • 2011-10-03
      • 1970-01-01
      相关资源
      最近更新 更多