node.js - nodejs dgram udp socket监听特定接口
问题描述
我目前正在用 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 上接收这些广播吗?
解决方案
您使用了错误的地址:
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',
^^^
推荐阅读
- r - 如何在R中按组执行复杂的代数运算?
- error-handling - PyTorch MNIST 模型运行时错误:mat1 和 mat2 形状不能相乘(3584x28 和 784x10)
- python - 如何使用 QSqlTableModel 和 QLineEdit 过滤 ms-access 数据库?
- c - fcntl 不锁定/解锁文件 [Unix - C]
- javascript - 使用 JS 的 HTML 标签占位符
- omnet++ - 运行时错误:未知参数
- java - 弹性4j 基于时间的断路器表现为基于计数
- azure - 无法向 Azure KeyVault 进行身份验证时,如何识别“第一方服务”是什么?
- python - 使用索引数组替换 numpy 零数组的值
- directive - Graphql - 覆盖输入类型中的属性