You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js发送UDP数据包实现、丢包问题排查及实时UDP测试日志工具需求

排查UDP数据包丢失问题 + 实时测试工具推荐

我来帮你拆解这个问题,你的UDP数据包大概率没丢,只是没被正确捕获或者代码里有隐藏的错误,下面一步步分析:

一、为什么tcpdump抓不到数据包?

最直接的原因是你监听的网卡不对:
目标地址是127.0.0.1(回环地址),所有发往这个地址的流量只会在本地回环网卡lo上传输,但你当前的tcpdump命令默认监听的是无线网卡wlp5s0,自然抓不到回环流量。

立刻修正tcpdump命令,指定监听lo网卡:

sudo tcpdump -i lo -n udp port 12000

再测试一次,应该就能看到数据包了。

二、代码里的隐藏问题:缺乏错误处理

就算网卡对了,如果发送过程中出问题(比如端口被占用、权限不足),你也完全不知道,因为你的代码没有处理错误:

  • client.send的回调里没检查err参数,发送失败也不会有任何提示
  • 没给UDP socket绑定error事件,未捕获的错误可能悄悄导致进程崩溃(但因为你提前返回了HTTP响应,可能没察觉到)

我帮你重构了代码,补上错误处理,同时优化异步逻辑:

const dgram = require('dgram');

export async function sendUDP(sess, parameters, res) {
  return new Promise((resolve, reject) => {
    const client = dgram.createSocket('udp4');

    // 必须监听error事件,避免未捕获异常导致进程挂掉
    client.on('error', (err) => {
      console.error(`UDP客户端出错: ${err.stack}`);
      client.close();
      reject(err);
    });

    const message = 'Hello World!';
    // 用message.length代替硬编码的12,字符串修改后也不会出错
    client.send(message, 0, message.length, 12000, '127.0.0.1', (err, bytes) => {
      client.close();
      if (err) {
        console.error(`发送UDP失败: ${err}`);
        return reject(err);
      }
      console.log(`成功发送${bytes}字节数据`);
      resolve();
    });
  })
  .then(() => {
    res.send("UDP数据包已成功发送");
  })
  .catch((err) => {
    // 发送失败时返回500错误给客户端,方便排查
    res.status(500).send(`发送UDP失败: ${err.message}`);
  });
}

三、实时测试UDP应用的实用工具

1. 自己写个极简UDP日志服务器(Node.js)

用几行代码就能搭一个实时打印UDP数据包的服务器,方便调试:

// udp-logger.js
const dgram = require('dgram');
const server = dgram.createSocket('udp4');

server.on('message', (msg, rinfo) => {
  console.log(`[${new Date().toISOString()}] 收到来自${rinfo.address}:${rinfo.port}的消息: ${msg.toString()}`);
});

server.bind(12000, '127.0.0.1', () => {
  console.log(`UDP日志服务器已启动,监听127.0.0.1:12000`);
});

运行node udp-logger.js,之后所有发往12000端口的UDP包都会实时打印在控制台。

2. 使用socat工具

socat是Linux下的全能网络工具,一行命令就能创建UDP echo服务并打印流量:

socat UDP-RECV:12000,fork STDOUT

收到的每个UDP数据包都会直接输出到终端。

3. 用netcat(nc)快速监听

大部分Linux系统自带netcat,用它监听UDP端口非常方便:

nc -ul 127.0.0.1 12000

任何发往这个端口的UDP数据都会立刻显示在终端里。


内容的提问来源于stack exchange,提问作者paul23

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 11:17:43