nodejs dgram udp套接字在特定接口上侦听

时间:2020-09-14 15:58:11

标签: node.js udp bind

我目前正在使用nodejs实现传统的专有udp协议。有必要知道软件包来自哪个网络接口。

我试图将两个套接字绑定到它们的网络地址。有任何想法我在这里做错了吗?

> 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 个答案:

答案 0 :(得分:0)

您使用了错误的地址:

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

vs。

address: '192.168.2.0',
                   ^^^
address: '192.168.178.0',
                     ^^^
相关问题