如果想知道当前局域网有多少设备,则可以通过 arp 来实现。对于 arp 的作用,可以看下之前写的网络工具-arp作用。
首先同一局域网下的设备,一定是划分的同一子网,则最多有多少个主机是可以确定。具体方法如下:
1、获取本机 IP 及子网掩码
2、根据上述信息确认需要扫描的主机IP
3、通过 arp 查询需要扫描的 IP,如得到应答就记录下来
对于本机 IP 及子网掩码的获取,可以看 网络编程-获取本机IP及MAC的几种方式,arp 查询发送接口则是直接使用的busybox\networking\udhcp\arpping.c,不在下面代码里体现了,我搞了个简单实现版本,如下:
int get_lan_ips(char *interface_name)
{
struct sockaddr_in local_ipv4;
struct sockaddr_in local_netmask;
struct sockaddr_ll local_mac;
unsigned int count = 0;
struct in_addr scan_ip;
unsigned int tmp;
unsigned int start_ip;
unsigned char *p = NULL;
int i = 0;
int host_bits = 0;
unsigned char mac[6] = {0};
memset(&local_ipv4, 0, sizeof(local_ipv4));
memset(&local_netmask, 0, sizeof(local_netmask));
memset(&local_mac, 0, sizeof(local_mac));
memset(&scan_ip, 0, sizeof(scan_ip));
// step1、获取本机 ip、 子网掩码及mac
get_local_ipv4(interface_name, (struct sockaddr *)&local_ipv4, sizeof(local_ipv4));
get_local_netmask(interface_name, (struct sockaddr *)&local_netmask, sizeof(local_netmask));
get_local_mac(interface_name, (struct sockaddr *)&local_mac, sizeof(local_mac));
// step2、计算需要遍历的主机地址
// 计算掩码的位数个数
tmp = ntohl(*(unsigned int *)&local_netmask.sin_addr);
while (tmp != 0)
{
tmp = tmp & (tmp-1);
count++;
}
// 主机位数就是32减去掩码位数
host_bits = 32 - count;
printf("host_bits:%u\n", host_bits);
start_ip = *(unsigned int *)&local_ipv4.sin_addr & *(unsigned int *)&local_netmask.sin_addr;
if (host_bits <= 8)
{
count = pow(2, host_bits) - 1;
p = &start_ip;
while (i < count-1)
{
p[3] += 1;
scan_ip = *(struct in_addr*)&start_ip;
//printf("scan_ip:%s\n", inet_ntoa(scan_ip));
i++;
// 进行 arp 扫描
arpping(start_ip, *(uint32_t *)&local_ipv4.sin_addr, local_mac.sll_addr, interface_name);
}
}
else; // 超过 8位方式类似,就是多层循环
return 0;
}
近期文章:
网络编程-获取本机IP及MAC的几种方式
网络编程-通过grep命令确认需要包含的头文件
–End–
每周学习总结,相信可以走的更远。