Linux netlink 多播路由更新

标签 linux sockets network-programming multicast netlink

我的应用程序应该从内核获取 netlink 多播路由更新。 我做了一些研究,发现多播使用不同的系列:RTNL_FAMILY_IPMR 组是 RTMGRP_IPV4_MROUTE。

但是如果我使用:

    sfd = socket (AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
    snl.nl_groups |= RTMGRP_IPV4_MROUTE

我没有收到任何更新。

但是

    sfd = socket (AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
    snl.nl_family = RTNL_FAMILY_IPMR;
    snl.nl_groups |= RTMGRP_IPV4_MROUTE;

这给出绑定(bind)错误",绑定(bind):无效参数

    sfd = socket (RTNL_FAMILY_IPMR, SOCK_RAW, NETLINK_ROUTE);

这会产生“协议(protocol)不支持的地址族”错误

我不确定如何从内核获取多播路由的更新。

最佳答案

从我之前的项目中复制粘贴:

    struct sockaddr_nl naddr;

    netlinkfd = socket (AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
    naddr.nl_family = AF_NETLINK;
    naddr.nl_groups = (1 << (RTNLGRP_LINK - 1)) |
                      (1 << (RTNLGRP_IPV4_ROUTE - 1)) |
                      (1 << (RTNLGRP_IPV6_ROUTE - 1)) |
                      (1 << (RTNLGRP_IPV4_IFADDR - 1)) |
                      (1 << (RTNLGRP_IPV6_IFADDR -1 ));
    if (bind (netlinkfd, (struct sockaddr *)&naddr, sizeof (naddr)))
    {
        error_foo();
        return;
    }

这个一般适用于接收链接、IP 和路由表。 (从这一点开始向我推送所有更改 - 如果我想接收当前状态,我也需要请求它们)。尝试同时拥有 ROUTE 和 MROUTE,因为您需要多播路由表,但它们可能会合并到普通路由表中

关于Linux netlink 多播路由更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36746679/

相关文章:

c++ - 'clock_gettime' 和 'gettimeofday' 的奇怪计时结果

Java套接字,那是死锁还是什么?

java - 使用 UDP 单播/多播向一组用户发送消息

java - 打洞后未建立 TCP 连接

c++ - 套接字 - 使用选择超时

c - 套接字描述符在调用 recvfrom 后更改

java - 如何处理 Java 中的 LinkageErrors?

linux - 在新行中显示 csv 文件的列标题

linux - 如何配置不同的 ALSA 默认值以通过一台设备捕获并通过另一台设备播放?

.net - 客户端和服务器之间的安全双向通信,包括大文件附件