сокет nodejs dgram udp прослушивает определенный интерфейс

#node.js #udp #bind

#node.js #udp #привязка

Вопрос:

В настоящее время я внедряю устаревший проприетарный протокол udp с помощью nodejs. Необходимо знать, с какого сетевого интерфейса поступали пакеты.

Я попытался привязать два сокета к их сетевым адресам. Есть идеи, что я здесь делаю не так?

 > ifconfig
en0: flags=8963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
    options=400<CHANNEL_IO>
    ether 3c:22:fb:4b:fc:31 
    inet6 fe80::1c0f:d365:a86d:be5d%en0 prefixlen 64 secured scopeid 0x6 
    inet 192.168.178.70 netmask 0xffffff00 broadcast 192.168.178.255
    inet6 2001:16b8:2ef3:4200:10d4:27f8:4945:c138 prefixlen 64 autoconf secured 
    inet6 2001:16b8:2ef3:4200:d919:b3b1:6220:ca12 prefixlen 64 autoconf temporary 
    nd6 options=201<PERFORMNUD,DAD>
    media: autoselect
    status: active
en8: flags=8963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
    options=6407<RXCSUM,TXCSUM,VLAN_MTU,CHANNEL_IO,PARTIAL_CSUM,ZEROINVERT_CSUM>
    ether 9c:eb:e8:85:92:6c 
    inet6 fe80::10b6:fa35:b1ee:ca68%en8 prefixlen 64 secured scopeid 0x1d 
    inet 192.168.2.10 netmask 0xffffff00 broadcast 192.168.2.255
    nd6 options=201<PERFORMNUD,DAD>
    media: autoselect (100baseTX <full-duplex>)
    status: active
  
 import * as dgram from 'dgram';

const socket1 = dgram.createSocket('udp4');
const socket2 = dgram.createSocket('udp4');
socket1.on('error', (error)=>{
  console.log('socket1 error:', JSON.stringify(error, null, 4));
})
socket2.on('error', (error)=>{
  console.log('socket2 error:', JSON.stringify(error, null, 4));
})
socket1.on('message', (message)=>{
  console.log('socket1 message:', JSON.stringify(message, null, 4));
})
socket2.on('message', (message)=>{
  console.log('socket2 message:', JSON.stringify(message, null, 4));
})
socket1.bind({
  port:2000,
  address: '192.168.2.0',
  exclusive:false,
}, ()=>{
  socket1.setBoradcast(true)
});
socket2.bind({
  port:2000,
  address: '192.168.178.0',
  exclusive:false,
}, ()=>{
  socket2.setBoradcast(true)
});

  

Выдает следующий вывод:

 socket1 error: {
    "errno": "EADDRNOTAVAIL",
    "code": "EADDRNOTAVAIL",
    "syscall": "bind",
    "address": "192.168.2.0",
    "port": 2000
}
socket2 error: {
    "errno": "EADDRNOTAVAIL",
    "code": "EADDRNOTAVAIL",
    "syscall": "bind",
    "address": "192.168.178.0",
    "port": 2000
}
  

Редактировать 1:

Благодаря ответу @Steffen Ullrich я теперь могу привязывать сокеты.

Но теперь я не могу получать широковещательные сообщения на этих сокетах в macos (это работает в Windows). Есть ли шанс получить эти трансляции также на macos?

Ответ №1:

Вы используете неправильные адреса:

 inet 192.168.178.70 netmask 0xffffff00 broadcast 192.168.178.255
                ^^^^
inet 192.168.2.10 netmask 0xffffff00 broadcast 192.168.2.255
              ^^^^
  

против.

 address: '192.168.2.0',
                   ^^^
address: '192.168.178.0',
                     ^^^
  

Комментарии:

1. Спасибо! Это абсолютно правильно. Но теперь я не могу получать трансляции по этим сокетам в macos. В Windows теперь все работает так, как ожидалось