[英]How to receive multicast join reports (IGMP v3)
我想看看哪个 Multicast-Join-Reports 飞过我的主机所在的.network。为此我写了一个小程序 TypeScript,它加入了RFC3376中定义的多播组“224.0.0.22”在 4.2.14 下作为多播加入报告的 IP 目的地。 但是即使我应该收到请求,我也没有收到任何请求,因为我正在通过 Wireshark 观看流量,并且发送和接收了 Multicast-Join-Reports。
编辑1 :附件是接收部分:
const interfaces = os.networkInterfaces();
const IGMP_V3_REPORT_MULTICAST_ADDRESS = '224.0.0.22';
const socket = dgram.createSocket('udp4');
const ipv4Interface = interfaces['eth0'].find((i) => i.family === 'IPv4');
if (ipv4Interface) {
socket.on('error', (e: Error) => {
console.log(`${ifaceName}: socket error: ${e}`);
sockResults[index] = false;
});
socket.on('listening', () => {
const address = socket.address();
console.log(`${ifaceName}: listening on ${address.address}:${address.port}`);
console.log(`${ifaceName}: joining multicast group with address: ${IGMP_V3_REPORT_MULTICAST_ADDRESS} for local address: ${ipv4Interface.address}`);
socket.addMembership(IGMP_V3_REPORT_MULTICAST_ADDRESS, ipv4Interface.address);
})
socket.on('message', (msg, rinfo) => {
console.log(`${ifaceName}: got ${msg}`);
});
socket.bind(0);
setTimeout(() => {
console.log(`${ifaceName}: dropping multicast membership for ${IGMP_V3_REPORT_MULTICAST_ADDRESS}`);
socket.dropMembership(IGMP_V3_REPORT_MULTICAST_ADDRESS, ipv4Interface.address);
console.log(`${ifaceName}: closing socket`);
socket.close();
resolve();
}, 120 * 1000);
}
让我们暂时忽略 IGMP、多播加入、交换机和所有这些东西,因为您已经在物理上接收到所需的数据包。
如果你想接收发往239.255.255.250
的数据包,你将不得不在socket.bind()
。
这些都是 Python 的实现,但希望转换为 TypeScript 不会很困难: https://github.com/leslie-wang/py-multicast-example/blob/master/mcast.py和这个.
具体来说,您需要:
socket.bind((MCAST_GRP, MCAST_PORT))
在您的情况下应该是('239.255.255.250', 1900)
,这是 UPnP 的默认设置。
然而,您使用socket.bind(0)
绑定到“任何可用端口”。
而且我相信给socket.addMembership()
的参数应该是您要从中接收消息的 mcast 组。 kernel,特别是处理 IP 的代码,需要知道将这些数据包向上“转发”到 UDP。
顺便说一句......在您的用例中,还可以选择嗅探而不是聆听,但它可能需要更高的权限。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.