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

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

使用原套接字,在创建接收和发送线程,获取当前网段内所有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);            }        }    }}
相关文章
|
8月前
|
缓存 网络协议 网络架构
【计算机网络】第三章 数据链路层(MAC地址 IP地址 ARP协议)
【计算机网络】第三章 数据链路层(MAC地址 IP地址 ARP协议)
192 1
|
5月前
|
域名解析 网络协议 虚拟化
|
4月前
|
缓存 网络协议 网络架构
网络抓包分析【IP,ICMP,ARP】以及 IP数据报,MAC帧,ICMP报和ARP报的数据报格式
本文详细介绍了如何使用网络抓包工具Wireshark进行网络抓包分析,包括以太网v2 MAC帧、IP数据报、ICMP报文和ARP报文的格式,以及不同网络通信的过程。文章通过抓包分析展示了IP数据报、ICMP数据报和ARP数据报的具体信息,包括MAC地址、IP地址、ICMP类型和代码、以及ARP的硬件类型、协议类型、操作类型等。通过这些分析,可以更好地理解网络协议的工作机制和数据传输过程。
网络抓包分析【IP,ICMP,ARP】以及 IP数据报,MAC帧,ICMP报和ARP报的数据报格式
IP和MAC的作用区别
【9月更文挑战第3天】IP 是地址,有定位功能;MAC 是身份证,无定位功能
|
7月前
|
弹性计算 Ubuntu Linux
为什么要学习去使用云服务器,外网 IP能干什么,MAC使用Termius连接阿里云服务器。保姆级教学
为什么要学习去使用云服务器,外网 IP能干什么,MAC使用Termius连接阿里云服务器。保姆级教学
|
8月前
|
网络协议 Linux Android开发
计算机网络:MAC地址 & IP地址 & ARP协议
计算机网络:MAC地址 & IP地址 & ARP协议
440 7
|
8月前
|
Python
pytho3 urllib urllib3 获取本地ip地址和mac地址发送post到指定http服务器
pytho3 urllib urllib3 获取本地ip地址和mac地址发送post到指定http服务器
69 0
|
缓存 网络协议
通过ARP协议实验,设置错误的IP和MAC地址的静态绑定项目,会使得两台主机之间无法通信,而删除该项目后可恢复通信,分析其原因。
通过ARP协议实验,设置错误的IP和MAC地址的静态绑定项目,会使得两台主机之间无法通信,而删除该项目后可恢复通信,分析其原因。
269 0