【问题标题】:Error EADDRNOTAVAIL on socket.send() in node (SSDP protocol)节点中 socket.send() 上的错误 EADDRNOTAVAIL(SSDP 协议)
【发布时间】:2018-07-21 20:47:54
【问题描述】:

我正在尝试实现一个 UPnP 发现服务工具(SSDP 协议),在这篇文章之后我在 python 中做了类似的事情:https://www.electricmonk.nl/log/2016/07/05/exploring-upnp-with-python/ 我想将它移植到节点(v. 8.6.0)和打字稿但是,当我尝试发送消息 (socket.send(...)) 时出现以下错误:

{ Error: send EADDRNOTAVAIL 239.255.255.250:1900
    at Object._errnoException (util.js:1019:11)
    at _exceptionWithHostPort (util.js:1041:20)
    at SendWrap.afterSend [as oncomplete] (dgram.js:475:11)
  code: 'EADDRNOTAVAIL',
  errno: 'EADDRNOTAVAIL',
  syscall: 'send',
  address: '239.255.255.250',
  port: 1900 }

我找到了 node 的 sn-p 代码,这使得这件事完全一致 (https://coolaj86.com/articles/adventures-in-upnp-with-node-js/),我认为我的代码非常等效,但是我不明白为什么我的代码不起作用

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

let msg_txt = 'M-SEARCH * HTTP/1.1\r\n' +
    'HOST:239.255.255.250:1900\r\n' +
    'ST:upnp:rootdevice\r\n' +
    'MX:2\r\n' +
    'MAN:"ssdp:discover"\r\n\r\n';

const message = Buffer.from(msg_txt);

socket.on('message', (msg: Buffer, info: any) => {
    console.log(msg.toString());
});

socket.bind({
    address: '239.255.255.250',
    port: 1900
}, (err) => {
    !!err && console.error(err);
});

socket.on('listening', () => {
    console.log('Sending msg...');
    socket.send(message, 0, message.length, 1900, '239.255.255.250', (err) => {
        !!err && console.error(err); // err != null
    });
});

我怀疑这是一个典型的单行问题,但过了一段时间我找不到它,欢迎任何帮助。

【问题讨论】:

    标签: node.js udp upnp ssdp


    【解决方案1】:

    对于它的价值,我在 Windows 上使用 Node 10 并在 localhost 上创建了一个 udp4 套接字进行了类似的设置。奇怪的是,在我的 CI 测试中,接受的答案中描述的设置适用于 Windows 上的每个操作系统和节点版本除了 Node 10。为了让事情正常进行,我必须显式绑定到地址 localhost 而不是 0.0.0.0,如下所示:

    const socket = dgram.createSocket('udp4').unref();
    socket.bind({
        address: 'localhost',
        port: 0
    }, (err) => {
        !!err && console.error(err);
    });
    

    【讨论】:

      【解决方案2】:

      我看到了,在 node 中的 API 有点不同,绑定应该针对 '0.0.0.0' iface 和端口 0(用于随机数),因此将绑定命令更改为以下代码即可修复它:

      socket.bind({
          address: '0.0.0.0',
          port: 0
      }, (err) => {
          !!err && console.error(err);
      });
      

      在我调用socket.recvfrom() 方法来获取UPnP 设备响应的python 中,没有明确的套接字绑定。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-05-26
        • 2014-11-22
        • 2015-10-11
        • 2013-03-03
        • 2014-06-25
        • 1970-01-01
        相关资源
        最近更新 更多