监控ARP表更改

时间:2016-05-22 06:44:28

标签: c++ linux arp netlink

我试图使用c ++在linux中监控我的ARP表,到目前为止我唯一的解决方案是每个时间间隔轮询/ proc / net / arp并与之前的状态进行比较。

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

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

如果netlink套接字无法提供此信息,是否有其他方法可以使用事件提取此信息而不进行轮询?

1 个答案:

答案 0 :(得分:2)

我能够找到如何使用netlink socket获取ARP表更改的事件,我唯一遗漏的是如何从事件中提取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
    }
}