查看局域网内所有IP的mac地址

本文介绍了一种使用C语言和原始套接字编程技术,通过创建发送和接收线程来扫描并获取局域网内所有IP对应的MAC地址的方法。通过向每个可能的IP地址发送ARP请求,解析接收到的ARP响应,从而实现对局域网设备的MAC地址进行扫描。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用原始套接字,在创建接收和发送线程,获取当前网段内所有IP的mac地址

#include <stdio.h>
#include <sys/socket.h>//socket
#include<arpa/inet.h>//htons
#include<netinet/ether.h>//ETH_P_ALL
#include <unistd.h>//close
#include <sys/ioctl.h>
#include <string.h>
#include <netpacket/packet.h>//sockaddr_ll
#include <net/if.h>
#include <pthread.h>
void *recvfroms(void *arg);
void *sendtos(void *arg);
int main(int argc, char const *argv[])
{    //创建一个原始套接字   
 int fd = socket(PF_PACKET,SOCK_RAW,htons(ETH_P_ALL));
    //创建一个发送线程和接收线程 
       pthread_t tid,tid1;   
        pthread_create(&tid,NULL,recvfroms,(void *)fd);//接收线程  
          pthread_create(&tid1,NULL,sendtos,(void *)fd);//发送线程  
            //线程分离 
               pthread_detach(tid);  
              pthread_detach(tid1);  
                while (1)  
                {
    		} 
         close(fd); 
            return 0;
            }
            void *recvfroms(void *arg)
            {   
             int fd = (int)arg;  
               //组包  
                 int i = 0;  
                   for ( i = 0; i < 255; i++) 
                      {         
                         unsigned char msg[1500] = {0xff,0xff,0xff,0xff,0xff,0xff,                               		 	0x00,0x0c,0x29,0xca,0xc4,0xf5,                               0x08,0x06,                               0x00,0x01,                               0x08,0x00,                               6,                               4,                               0x00,0x01,                               0x00,0x0c,0x29,0xca,0xc4,0xf5,                               10,0,121,87,                               0x00,0x00,0x00,0x00,0x00,0x00,                                 10,0,121,i                           }; 
                            int len = 42; 
                               //从原始套接字发送数据   
                                //获取网络接口类型  
                                  struct ifreq ethreq;
                                      strncpy(ethreq.ifr_name,"eth0",IFNAMSIZ);  
                                        ioctl(fd,SIOCGIFINDEX,&ethreq);  
                                          //指明出去的网络接口   
                                           struct sockaddr_ll sll;  
                                             bzero(&sll,sizeof(sll)); 
                                                sll.sll_ifindex = ethreq.ifr_ifindex;  
                                                  sendto(fd,msg,len,0,(struct sockaddr *)&sll,sizeof(sll));  
                                                    }  
}
void *sendtos(void *arg)
{    
int fd = (int)arg; 
   //接收对方的应答  
     while (1)    {     
        unsigned char recv_buf[1500] = "";  
              recvfrom(fd,recv_buf,sizeof(recv_buf),0,NULL,NULL);   
                   if(ntohs(*(unsigned short *)(recv_buf+12)) == 0x0806)//判断是否为ARP报文
                           {         
                              if(ntohs(*(unsigned short *)(recv_buf+14+6))==2)     
                                     {       
                                              char mac[18] = "";          
                                                    sprintf(mac,"%02x:%02x:%02x:%02x:%02x:%02x:",\                recv_buf[6],recv_buf[7],recv_buf[8],recv_buf[9],recv_buf[10],recv_buf[11]);
                                                                    char ip[16] = "";                sprintf(ip,"%d.%d.%d.%d",recv_buf[28],recv_buf[29],recv_buf[30],recv_buf[31]);     
                                                                               printf("%s----->%s\n",ip,mac);            }        }    }}
### 查找局域网内所有设备的IP地址 为了在局域网查看所有设备的IP地址,可以采用多种方法和技术工具来实现这一目标。 #### 使用 `ping` 批量扫描 一种简单的方法是利用批处理文件或脚本向整个子网范围发送ICMP回显请求(即Ping),从而检测哪些主机处于活动状态。这种方法适用于较小规模的家庭网络环境,在这种情况下,可以通过编写简单的循环语句依次尝试联系从192.168.1.1至192.168.1.254之间的每一个可能存在的IPv4地址[^1]: ```batch @echo off for /L %%i in (1,1,254) do ( ping -n 1 192.168.1.%%i | find "TTL=" && echo Device found at 192.168.1.%%i ) pause ``` #### 运用 Nmap 工具进行端口扫描和服务探测 更高效的方式则是借助专门设计用于网络安全审计的强大开源软件——Nmap(Network Mapper),它不仅能够快速定位在线节点,还能提供关于操作系统版本、开放端口等额外信息。执行如下命令即可获取指定范围内活跃主机及其对应的MAC地址和厂商名称: ```bash nmap -sn 192.168.1.0/24 ``` 上述指令中的 `-sn` 参数表示仅做存活测试而不进行TCP三次握手,默认会显示详细的输出结果;如果只想提取IP列表,则可进一步加工原始数据流,比如结合管道符与其他Linux实用程序一起工作,像这样: ```bash nmap -sP 192.168.1.2-255 | grep -i 'report for' | awk '{print $5;}' ``` 这将返回一个简洁明了的结果集,其中每一行代表一台联网机器的确切位置[^2]。 #### CMD环境下操作流程概述 对于Windows用户而言,除了安装第三方应用程序之外,还可以依靠内置的功能完成相似的任务。具体来说,先记录现有连接情况作为参照样本,之后再接入待识别的新装置并再次采集最新状况作对比分析,以此找出差异部分所指示的目标对象。例如针对Android手机调试场景下的应用卸载需求,按照以下步骤实施可能会有所帮助[^3]: 1. 获取初始状态下全部成员的信息; 2. 插入有线接口使移动终端加入进来; 3. 对比前后两次收集的数据集合发现变化之处; 4. 配置ADB远程访问权限进而操控对应进程终止服务或者移除特定包体。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小卡丘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值