通过IP或socket获取对方的MAC地址

简介: 1。通过已经连接的socket文件获取:   [cpp] view plaincopy   int getpeermac( int sockfd, char *buf )   {       int ret =0;       struct arpreq ...

1。通过已经连接的socket文件获取:

 

[cpp]  view plain copy
 
  1. int getpeermac( int sockfd, char *buf )  
  2. {  
  3.     int ret =0;  
  4.     struct arpreq arpreq;  
  5.     struct sockaddr_in dstadd_in;  
  6.     socklen_t  len = sizeof( struct sockaddr_in );  
  7.     memset( &arpreq, 0, sizeof( struct arpreq ));  
  8.     memset( &dstadd_in, 0, sizeof( struct sockaddr_in ));  
  9.     if( getpeername( sockfd, (struct sockaddr*)&dstadd_in, &len ) < 0 )  
  10.         err_err("getpeername()");  
  11.     else  
  12.     {  
  13.         memcpy( &arpreq.arp_pa, &dstadd_in, sizeof( struct sockaddr_in ));  
  14.         strcpy(arpreq.arp_dev, "eth1");  
  15.         arpreq.arp_pa.sa_family = AF_INET;  
  16.         arpreq.arp_ha.sa_family = AF_UNSPEC;  
  17.         if( ioctl( sockfd, SIOCGARP, &arpreq ) < 0 )  
  18.             err_err("ioctl SIOCGARP");  
  19.         else  
  20.         {  
  21.             unsigned char* ptr = (unsigned char *)arpreq.arp_ha.sa_data;  
  22.             ret = sprintf(buf, "%02x%02x%02x%02x%02x%02x", *ptr, *(ptr+1), *(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5));  
  23.         }  
  24.     }  
  25.     return ret;  
  26. }   

 

 

2。 通过IP获取:

 

[cpp]  view plain copy
 
  1. int getpeermac_by_ip(char *ipaddr, char* buf)  
  2. {  
  3.     int     sockfd;  
  4.     unsigned char *ptr;  
  5.     struct arpreq arpreq;  
  6.     struct sockaddr_in *sin;  
  7.     struct sockaddr_storage ss;  
  8.     char addr[INET_ADDRSTRLEN+1];  
  9.   
  10.     memset(addr, 0, INET_ADDRSTRLEN+1);  
  11.     memset(&ss, 0, sizeof(ss));  
  12.     if (argc != 2) {  
  13.         printf("USAGE arpg  ip_addr/n");  
  14.         return -1;  
  15.     }  
  16.     sockfd = socket(AF_INET, SOCK_DGRAM, 0);  
  17.     if (sockfd == -1) {  
  18.         perror("socket error");  
  19.         return -1;  
  20.     }  
  21.     sin = (struct sockaddr_in *) &ss;  
  22.     sin->sin_family = AF_INET;  
  23.     if (inet_pton(AF_INET, argv[1], &(sin->sin_addr)) <= 0) {  
  24.         perror("inet_pton error");  
  25.         return -1;  
  26.     }  
  27.     sin = (struct sockaddr_in *) &arpreq.arp_pa;  
  28.     memcpy(sin, &ss, sizeof(struct sockaddr_in));  
  29.     strcpy(arpreq.arp_dev, "eth1");  
  30.     arpreq.arp_ha.sa_family = AF_UNSPEC;  
  31.     if (ioctl(sockfd, SIOCGARP, &arpreq) < 0) {  
  32.         perror("ioctl SIOCGARP: ");  
  33.         return -1;  
  34.     }  
  35.     ptr = (unsigned char *)arpreq.arp_ha.sa_data;  
  36.     sprintf(buf,"%x:%x:%x:%x:%x:%x", *ptr, *(ptr+1), *(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5));  
  37.     return 0;  
  38. }  
目录
打赏
0
0
0
0
94
分享
相关文章
【计算机网络】第三章 数据链路层(MAC地址 IP地址 ARP协议)
【计算机网络】第三章 数据链路层(MAC地址 IP地址 ARP协议)
292 1
为什么有了MAC还需要IP?
通过上述分析和解释,我们可以清晰地看到为什么在计算机网络中既需要MAC地址也需要IP地址。它们各自的功能和作用相辅相成,共同确保了网络通信的有效性和灵活性。
60 9
Java网络编程入门涉及TCP/IP协议理解与Socket通信。
【6月更文挑战第21天】Java网络编程入门涉及TCP/IP协议理解与Socket通信。TCP/IP协议包括应用层、传输层、网络层和数据链路层。使用Java的`ServerSocket`和`Socket`类,服务器监听端口,接受客户端连接,而客户端连接指定服务器并交换数据。基础示例展示如何创建服务器和发送消息。进阶可涉及多线程、NIO和安全传输。学习这些基础知识能助你构建网络应用。
76 1
|
12月前
|
Java的Socket编程:TCP/IP与UDP深入探索
Java的Socket编程:TCP/IP与UDP深入探索
154 0
网络抓包分析【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 是身份证,无定位功能
为什么要学习去使用云服务器,外网 IP能干什么,MAC使用Termius连接阿里云服务器。保姆级教学
为什么要学习去使用云服务器,外网 IP能干什么,MAC使用Termius连接阿里云服务器。保姆级教学
计算机网络:MAC地址 & IP地址 & ARP协议
计算机网络:MAC地址 & IP地址 & ARP协议
627 7
TCP/IP、Http、Socket之间的区别
TCP/IP、Http、Socket之间的区别
198 3