我试图使用c ++在linux中监控我的ARP表,到目前为止我唯一的解决方案是每个时间间隔轮询/ proc / net / arp并与之前的状态进行比较。
我可以使用netlink套接字来接收内核中有关这些更改的事件吗?
我环顾四周,找不到合适的答案,我找到了像ip-monitor这样的通行费,但没有发现他们如何获得这些数据。
如果netlink套接字无法提供此信息,是否有其他方法可以使用事件提取此信息而不进行轮询?
答案 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
}
}