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

Node.js中如何获取UDP消息的目标接收地址?

获取UDP数据包的目标接收地址(Node.js)

我们用Node.js启动UDP服务器,绑定0.0.0.0:8989以监听所有网络接口的消息:

import dgram from 'node:dgram';
const server = dgram.createSocket('udp4');

server.on('message', (msg, rinfo) => {
  // 如何获取数据包的目标接收地址?
});

server.bind(8989, '0.0.0.0');

收到消息时,rinfo对象仅能提供发送方的地址和端口信息,无法直接获取数据包的目标接收地址,以下是几种可行的解决方案:


方法1:绑定到具体网络接口IP

如果服务器有明确的对外IP,直接绑定该IP而非0.0.0.0,此时服务器的绑定地址即为数据包的目标地址:

server.bind(8989, '192.168.1.100'); // 替换为你的服务器实际IP

server.on('message', (msg, rinfo) => {
  const targetAddress = server.address().address;
  console.log(`数据包目标地址:${targetAddress}`);
});

缺点:若服务器有多个IP,需为每个IP创建单独的Socket,扩展性较差。


方法2:利用系统套接字选项(仅Linux/macOS)

在Linux或macOS系统下,可通过设置套接字选项获取目标地址,以Linux为例:

import dgram from 'node:dgram';
const server = dgram.createSocket('udp4');

// 开启IP_RECVDSTADDR选项,允许接收数据包的目标地址信息
server.setsockopt(dgram.SOL_IP, dgram.IP_RECVDSTADDR, 1);

server.on('listening', () => {
  const recvBuffer = Buffer.alloc(1024);
  const controlBuffer = Buffer.alloc(1024);

  const recvNext = () => {
    server.recvmsg(recvBuffer, controlBuffer, (err, bytesRead, flags, rinfo, control) => {
      if (err) throw err;

      // 解析控制信息中的目标地址
      for (const item of control) {
        if (item.name === 'IP_RECVDSTADDR') {
          const addrInt = item.value.readUInt32BE(0);
          const targetIp = `${(addrInt >> 24) & 0xff}.${(addrInt >> 16) & 0xff}.${(addrInt >> 8) & 0xff}.${addrInt & 0xff}`;
          console.log(`数据包目标地址:${targetIp}`);
          break;
        }
      }

      // 处理收到的消息内容
      const msg = recvBuffer.subarray(0, bytesRead);
      console.log(`收到消息:${msg.toString()}`);

      // 继续接收下一个数据包
      recvNext();
    });
  };

  recvNext();
});

server.bind(8989, '0.0.0.0');

注意:该方法依赖系统内核支持,Windows系统无法使用,且需要Node.js 12及以上版本(支持recvmsg方法)。


方法3:使用第三方库

若不想处理底层细节,可使用dgram-raw这类封装好的第三方库:

import dgramRaw from 'dgram-raw';

const server = dgramRaw.createSocket('udp4');

server.on('message', (msg, rinfo) => {
  console.log(`数据包目标地址:${rinfo.dst.address}`);
  console.log(`收到消息:${msg.toString()}`);
});

server.bind(8989, '0.0.0.0');

缺点:需额外安装依赖,跨平台兼容性需自行验证。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 13:25:25