【问题标题】:How to suppress multiple netlink events?如何抑制多个 netlink 事件?
【发布时间】:2014-12-30 05:46:48
【问题描述】:

我一直使用this code 作为示例来接收 Linux 机器上的接口启动/关闭事件。我能够正确接收事件,但是当接口从先前的关闭状态出现时,我会收到多个这样的 netlink 事件:

Event received >> NETLINK::Down
Event received >> NETLINK::Down
Event received >> NETLINK::Up

编辑:我在这段代码中修改了一行:

addr.nl_groups = RTMGRP_LINK | RTMGRP_IPV4_IFADDR | RTMGRP_IPV6_IFADDR;

到:

addr.nl_groups = RTMGRP_LINK;

但我仍然收到多个事件。任何人都可以建议是否可以抑制这些事件以接收每个状态的唯一事件?如果有怎么办?

【问题讨论】:

    标签: c linux sockets netlink


    【解决方案1】:

    经过大量研究后,我终于完成了这项工作。有一个名为“ifi_change”的标志,它给出了 Netdevice 状态变化的变化。我无法想到它,因为rtnetlink man page 没有提及它。它说它是为将来使用而保留的,应始终设置为 0xFFFFFFFF。但是,它的值会随着接口当前状态的变化而变化。如果有状态变化,它会给出一个有限值,否则它为零。使用此检查,我能够抑制多个网络链接消息。

    【讨论】:

    • 您是如何了解 ifi_change 的?通过浏览和理解内核代码?或者是否还有其他我无法找到的文档。
    【解决方案2】:

    查看代码,我怀疑您收到了以下每种类型事件的通知:

    addr.nl_groups = RTMGRP_LINK | RTMGRP_IPV4_IFADDR | RTMGRP_IPV6_IFADDR;
    

    我建议缩小范围

    addr.nl_groups = RTMGRP_LINK;
    

    (或酌情转至 IPv4/IPv6。)

    【讨论】:

    • 糟糕!抱歉,我忘了提及我已经尝试过了,但我仍然收到多个向上/向下事件。
    • @iqstatic:如果您正在运行的代码与您链接到的代码不同,我认为您应该在问题中包含您的代码(减少到重现所需的绝对最小值问题)。
    • 您建议的更改是我所做的唯一更改。
    猜你喜欢
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    • 2017-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多