我目前正在使用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上接收这些广播?
答案 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',
^^^