如何使用Node.js发送UDP数据包?

9

好的,我有一个小路线,应该发送一个UDP数据包并打印确认。根据节点上的文档,以下内容应该可以正常工作:

const dgram = require('dgram');

export async function sendUDP(sess, parameters: {}, res) {
    const client = dgram.createSocket('udp4');
    client.send('Hello World!',0, 12, 12000, '127.0.0.1', function(err, bytes) {
        client.close();
    });

    //res is the response object from express
    return res.send("Send udp packet");
}

应该向回调IP(本地机器)的端口12000发送一个UDP请求。还要发送一个回复,说明已经发送了UDP数据包。

当我向正确的URL发送请求时,我注意到在Postman中收到了回复Send udp packet。所以这个部分是可以工作的。

然而,UDP数据包似乎丢失了,在我的本地Ubuntu上使用tcpdump却没有任何结果:

sudo tcpdump -n udp port 12000

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on wlp5s0, link-type EN10MB (Ethernet), capture size 262144 bytes

0 packets captured
0 packets received by filter
0 packets dropped by kernel

(当然在测试功能时tcpdump已经一直在运行)。UDP请求会去哪里? 发生了什么?

我希望有一个生活记录器,这样我就可以轻松地使用udp测试nodejs应用程序。

1个回答

8
您需要告诉tcpdump它需要监听哪个接口。

tcpdump -i lo udp port 12000

lo是本地主机的接口。

在此链接中获取更多信息。

如果您想保存流量日志,可以使用wireshark

我使用'!(udp.port == 53 || tcp.port == 53) && udp'作为筛选器,仅查看udp数据包。

我将此代码添加到我的服务器并将udp数据包发送到那里以打印内容。

const dgram = require('dgram');
const serverUDP = dgram.createSocket('udp4');

serverUDP.on('error', (err) => {
  console.log(`serverUDP error:\n${err.stack}`);
  serverUDP.close();
});

serverUDP.on('message', (msg, rinfo) => {
  console.log(`serverUDP got: ${msg} from ${rinfo.address}:${rinfo.port}`);
});

serverUDP.on('listening', () => {
  const address = serverUDP.address();
  console.log(`serverUDP listening ${address.address}:${address.port}`);
});

serverUDP.bind(3001);

这是从Node官方文档中的代码示例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接