繁体   English   中英

如何接收多播加入报告 (IGMP v3)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM