2016-05-22 3 views
0

Я пытаюсь контролировать таблицу ARP в linux с помощью C++, и пока единственное, что у меня есть, - это опрос/proc/net/arp каждого интервала и сравнение с предыдущим состоянием.Мониторинг изменений таблицы ARP

Могу ли я использовать сокеты netlink для получения событий из ядра при этих изменениях?

Я смотрю вокруг и не могу найти прямой ответ, я нашел, как ip-monitor, но не узнал, как они получают эти данные.

Если netlink socket не может предоставить эту информацию, есть ли другой способ извлечь это с помощью событий, а не опроса?

+0

Я также могу справиться с чем-то вроде inotify, чтобы получить событие при изменении, а затем сравнить текущее состояние с предыдущим, но inotify не может контролировать/proc –

+0

Я нашел [это] (http://stackoverflow.com/questions/11788326/extract-current-route-from-netlink-message-code-attach) для мониторинга изменений таблицы маршрутизации, могу ли я использовать тот же метод для мониторинга таблицы ARP? –

ответ

2

я смог найти, как получить события на изменения таблицы ARP с помощью NETLINK сокет, единственное, что я не хватает, как извлечь детали 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 
    } 
}