监控 ARP table 变化

Monitoring ARP table changes

我正在尝试使用 C++ 在 linux 中监视我的 ARP table,到目前为止,我唯一的解决方案是每隔一段时间轮询 /proc/net/arp 并与之前的状态进行比较.

我可以使用 netlink 套接字从内核接收有关这些更改的事件吗?

我环顾四周,找不到直接的答案,我找到了像 ip-monitor 这样的通行费,但没有找到他们是如何获得这些数据的。

如果 netlink 套接字无法提供此信息,是否有任何其他方法可以通过事件而不是轮询来提取此信息?

我能够找到如何使用 netlink 套接字获取有关 ARP table 更改的事件,我唯一缺少的是如何从事件中提取 ARP 详细信息,但现在这样做:

int sock;
static struct sockaddr_nl g_addr;

/* Zeroing addr */
bzero(&g_addr, sizeof(g_addr));
g_addr.nl_family = AF_NETLINK;
g_addr.nl_groups = nl_mgrp(RTNLGRP_NEIGH);

if ((sock = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE)) < 0) {
    printf("socket() error: %s", strerror(errno));
    return -1;
}

if (bind(sock, (struct sockaddr *) &g_addr, sizeof(g_addr)) < 0) {
    printf("bind() error: %s", strerror(errno));
    return -1;
}

char buffer[4096];
int received_bytes = 0;

while (true) {
    received_bytes = recv(sock, buffer, sizeof(buffer), 0);
    if (received_bytes > 0) {
        printf("Event\n");
        // How to parse the event
    }
}