gpt4 book ai didi

linux - 如何通过程序而不是命令清除linux中的arp缓存

转载 作者:太空狗 更新时间:2023-10-29 12:28:05 30 4
gpt4 key购买 nike

如何在 linux 中清除 arp 缓存 通过程序,而不是使用 arp 命令?是否有可用的库函数来实现这个?

============================================= ============================编辑

linux 中,我想定期清除arp 缓存 并发送ping 数据包以查找局域网中的主机(通过收集arp 响应和ICMP 回复)。由于一些主机不回复 ping,我尝试在我的程序中接收 arp 响应和 ICMP 回复。但如果arp cache 有IP 信息,它不会发送针对该IP 的arp 请求,拓扑可能不完整。所以我想定期清除 arp 缓存。如何在我的程序中定期清除 arp 缓存?感谢您的宝贵时间。

最佳答案

事实证明它并没有那么糟糕。你必须:

  1. 创建一个原始套接字(如果您还没有的话)。您可以使用 ICMP 套接字或任何您想要的 IPPROTO 来完成。我已经使用 ICMP 套接字对其进行了测试。

int sd = socket(PF_INET, SOCK_RAW, IPPROTO_ICMP);

  1. 获取要从缓存中刷新的 IP 的 sockaddr。您可以使用 gethostbyname 或多种机制来执行此操作。我会调用我们的地址 hostaddy

  2. 创建一个 arpreq 结构,并将除 arp_pa 字段之外的所有字段设为零。

struct arpreq ar;
memset(&ar, 0, sizeof(ar));
memcpy(&ar.arp_pa, hostaddy, sizeof( struct sockaddr_in ) );

  1. 调用ioctl在 socket 和结构上,带有SIOCDARP .

int ret = ioctl( sd, SIOCDARP, &ar );
if( ret ) fprintf( stderr, "Failed to clear entry.\n" );

  1. 如果您不打算再使用它,请不要忘记关闭它 close(sd)

来源:(1) strace arp -d <ip>(2) https://svn.nmap.org/nmap/libdnet-stripped/src/arp-ioctl.c

关于linux - 如何通过程序而不是命令清除linux中的arp缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35910479/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com