网络编程-局域网IP扫描

Posted by 周思进 on February 20, 2021

如果想知道当前局域网有多少设备,则可以通过 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–

每周学习总结,相信可以走的更远。