【问题标题】:Node.js UDP Multicast over NetworkNode.js UDP 网络多播
【发布时间】:2017-03-30 05:35:09
【问题描述】:

我在 UDP 多播概念验证中遇到了重复的 EADDRNOTAVAIL 问题。我有一台 Linux 服务器向 Windows 客户端发送多播消息(已尝试将其反转但无济于事..)。在同一台机器上运行同时客户端和服务器时,服务器可以正常工作,但不能通过相同网络。

下面是我尝试使用的代码、我正在使用的 IP 以及我收到的错误。

我不确定我做错了什么!


环境

Windows 本地 IP:192.168.1.10
Linux本地IP:192.168.1.11

服务器:server.js

const SRC_PORT = 6025;
const PORT = 6024;
const MULTICAST_ADDR = '239.255.255.250';
const LOCAL_IP = '192.168.1.11';
const dgram = require('dgram');
const server = dgram.createSocket("udp4");

server.bind(SRC_PORT, LOCAL_IP, function () {
  setInterval(function () {
    let message = new Buffer(new Date().toLocaleTimeString());
    server.send(message, 0, message.length, PORT, MULTICAST_ADDR, function () {
      console.log("Sent '" + message + "'");
    });
  }, 4000);
});


客户:client.js

const PORT = 6024;
const MULTICAST_ADDR = '239.255.255.250';
const LOCAL_IP = '192.168.1.10';
const HOST_IP = '192.168.1.11';
const dgram = require('dgram');
const client = dgram.createSocket('udp4');

client.on('listening', function () {
  let address = client.address();
  console.log('UDP Client listening on ' + address.address + ":" + address.port);
});

client.on('message', function (message, rinfo) {
  console.log('Message from: ' + rinfo.address + ':' + rinfo.port + ' - ' + message);
});

//*** Also tried with client.bind(PORT, LOCAL_IP, ... and failed
client.bind(PORT, function () {
  client.addMembership(MULTICAST_ADDR, HOST_IP);
});

错误

dgram.js:508
    throw errnoException(err, 'addMembership');
    ^

Error: addMembership EADDRNOTAVAIL
    at exports._errnoException (util.js:1026:11)
    at Socket.addMembership (dgram.js:508:11)
    at Socket.<anonymous> (~/dev/node-multicast/client.js:16:10)
    at Socket.g (events.js:286:16)
    at emitNone (events.js:91:20)
    at Socket.emit (events.js:185:7)
    at startListening (dgram.js:121:10)
    at dgram.js:228:7
    at _combinedTickCallback (internal/process/next_tick.js:77:11)

【问题讨论】:

    标签: javascript node.js network-programming udp multicast


    【解决方案1】:

    我确定你从这个错误中加入了错误的 multicastInterface:

    addMembership EADDRNOTAVAIL

    应该是你本地接口的地址: client.addMembership(MULTICAST_ADDR, LOCAL_IP);

    正如doc 所说:

    socket.addMembership(multicastAddress[, multicastInterface])
    告诉内核加入给定的多播组 使用 IP_ADD_MEMBERSHIP 的 multicastAddress 和 multicastInterface 套接字选项。如果未指定 multicastInterface 参数, 操作系统将选择一个界面并添加成员资格 给它。要将成员资格添加到每个可用接口,请调用 addMembership 多次,每个接口一次。

    【讨论】:

    • 哇。我知道我错过了一些简单的东西。太感谢了!将客户端上的地址更改为其自己的本地 IP 地址(代码中的192.168.1.10)有效!
    猜你喜欢
    • 1970-01-01
    • 2011-09-16
    • 2012-08-11
    • 1970-01-01
    • 2018-01-16
    • 2010-10-20
    • 2014-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多