2016-05-22 6 views
0

Ich versuche, meine ARP-Tabelle in Linux mit C++ zu überwachen und bis jetzt die einzige Lösung, die ich habe, ist die Abfrage/proc/net/arp jedes Intervall und vergleichen mit dem vorherigen Zustand.Überwachung ARP-Tabelle ändert

Kann ich Netlink-Sockets verwenden, um Ereignisse vom Kernel bei diesen Änderungen zu empfangen?

Ich habe mich umgesehen und kann keine klare Antwort finden, ich fand Maut wie ip-monitor, aber habe nicht herausgefunden, wie sie diese Daten bekommen.

Wenn netlink socket diese Informationen nicht bereitstellen kann, gibt es eine andere Möglichkeit, dies mit Ereignissen zu extrahieren und nicht zu pollen?

+0

Ich kann auch mit etwas wie inotify verwalten, um Ereignis bei Änderung zu erhalten und dann den aktuellen Zustand mit dem vorherigen zu vergleichen, aber inotify kann nicht überwachen/proc –

+0

Ich habe gefunden [this] (http://stackoverflow.com/questions/11788326/extract-current-route-from-netlink-message-code-attached) zum Überwachen von Routing-Tabellenänderungen, kann ich die ARP-Tabelle mit der gleichen Technik überwachen? –

Antwort

2

ich war in der Lage zu finden, wie die Ereignisse auf ARP-Tabelle Änderungen mit Netlink-Socket zu bekommen, das einzige, was ich vermisst habe, ist, wie die ARP Details aus dem Ereignis zu extrahieren, aber jetzt wird dies tun:

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 
    } 
}