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

本文介绍了两种获取对端设备MAC地址的方法:一种是通过已建立的socket连接;另一种是通过指定的IP地址。这两种方法均使用C/C++语言实现,并详细展示了相关代码片段。
1.通过已经连接的socket文件获取: view plaincopy to clipboardprint? int getpeermac( int sockfd, char *buf ) { int ret =0; struct arpreq arpreq; struct sockaddr_in dstadd_in; socklen_t len = sizeof( struct sockaddr_in ); memset( &arpreq, 0, sizeof( struct arpreq )); memset( &dstadd_in, 0, sizeof( struct sockaddr_in )); if( getpeername( sockfd, (struct sockaddr*)&dstadd_in, &len ) < 0 ) err_err("getpeername()"); else { memcpy( &arpreq.arp_pa, &dstadd_in, sizeof( struct sockaddr_in )); strcpy(arpreq.arp_dev, "eth1"); arpreq.arp_pa.sa_family = AF_INET; arpreq.arp_ha.sa_family = AF_UNSPEC; if( ioctl( sockfd, SIOCGARP, &arpreq ) < 0 ) err_err("ioctl SIOCGARP"); else { unsigned char* ptr = (unsigned char *)arpreq.arp_ha.sa_data; ret = sprintf(buf, "%02x%02x%02x%02x%02x%02x", *ptr, *(ptr+1), *(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5)); } } return ret; } int getpeermac( int sockfd, char *buf ) { int ret =0; struct arpreq arpreq; struct sockaddr_in dstadd_in; socklen_t len = sizeof( struct sockaddr_in ); memset( &arpreq, 0, sizeof( struct arpreq )); memset( &dstadd_in, 0, sizeof( struct sockaddr_in )); if( getpeername( sockfd, (struct sockaddr*)&dstadd_in, &len ) < 0 ) err_err("getpeername()"); else { memcpy( &arpreq.arp_pa, &dstadd_in, sizeof( struct sockaddr_in )); strcpy(arpreq.arp_dev, "eth1"); arpreq.arp_pa.sa_family = AF_INET; arpreq.arp_ha.sa_family = AF_UNSPEC; if( ioctl( sockfd, SIOCGARP, &arpreq ) < 0 ) err_err("ioctl SIOCGARP"); else { unsigned char* ptr = (unsigned char *)arpreq.arp_ha.sa_data; ret = sprintf(buf, "%02x%02x%02x%02x%02x%02x", *ptr, *(ptr+1), *(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5)); } } return ret; } 2. 通过IP获取: view plaincopy to clipboardprint? int getpeermac_by_ip(char *ipaddr, char* buf) { int sockfd; unsigned char *ptr; struct arpreq arpreq; struct sockaddr_in *sin; struct sockaddr_storage ss; char addr[INET_ADDRSTRLEN+1]; memset(addr, 0, INET_ADDRSTRLEN+1); memset(&ss, 0, sizeof(ss)); if (argc != 2) { printf("USAGE arpg ip_addr/n"); return -1; } sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd == -1) { perror("socket error" 文章出处:DIY部落(http://www.diybl.com/course/3_program/c++/cppjs/20091022/179857.html#)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值