我的应用程序应该从内核获取 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/