通过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. }  
目录
相关文章
|
2月前
|
缓存 网络协议 网络架构
【计算机网络】第三章 数据链路层(MAC地址 IP地址 ARP协议)
【计算机网络】第三章 数据链路层(MAC地址 IP地址 ARP协议)
47 1
|
22天前
|
网络协议 安全 Java
Java网络编程入门涉及TCP/IP协议理解与Socket通信。
【6月更文挑战第21天】Java网络编程入门涉及TCP/IP协议理解与Socket通信。TCP/IP协议包括应用层、传输层、网络层和数据链路层。使用Java的`ServerSocket`和`Socket`类,服务器监听端口,接受客户端连接,而客户端连接指定服务器并交换数据。基础示例展示如何创建服务器和发送消息。进阶可涉及多线程、NIO和安全传输。学习这些基础知识能助你构建网络应用。
26 1
|
2月前
|
网络协议 Java
Java的Socket编程:TCP/IP与UDP深入探索
Java的Socket编程:TCP/IP与UDP深入探索
26 0
|
1月前
|
弹性计算 Ubuntu Linux
为什么要学习去使用云服务器,外网 IP能干什么,MAC使用Termius连接阿里云服务器。保姆级教学
为什么要学习去使用云服务器,外网 IP能干什么,MAC使用Termius连接阿里云服务器。保姆级教学
|
2月前
|
网络协议 Linux Android开发
计算机网络:MAC地址 & IP地址 & ARP协议
计算机网络:MAC地址 & IP地址 & ARP协议
64 7
|
2月前
|
网络协议 Linux Windows
TCP/IP、Http、Socket之间的区别
TCP/IP、Http、Socket之间的区别
|
2月前
|
Linux 开发工具
Linux配置静态ip及克隆出现Mac相同问题
Linux配置静态ip及克隆出现Mac相同问题
47 0
Linux配置静态ip及克隆出现Mac相同问题
|
2月前
|
Python
pytho3 urllib urllib3 获取本地ip地址和mac地址发送post到指定http服务器
pytho3 urllib urllib3 获取本地ip地址和mac地址发送post到指定http服务器
42 0
|
2月前
|
Python
pytho2 urllib urllib2 获取本地ip地址和mac地址发送post到指定http服务器
pytho2 urllib urllib2 获取本地ip地址和mac地址发送post到指定http服务器
27 0
|
2月前
|
网络协议 安全 Java
Java网络编程入门指南:TCP/IP协议与Socket通信
Java网络编程入门指南:TCP/IP协议与Socket通信
117 1