通过IP或socket获取对方的MAC地址
通过IP或socket获取对方的MAC地址 收藏
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 )
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 )
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 )
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 )
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");
return -1;
}
sin = (struct sockaddr_in *) &ss;
sin->sin_family = AF_INET;
if (inet_pton(AF_INET, argv[1], &(sin->sin_addr))
perror("inet_pton error");
return -1;
}
sin = (struct sockaddr_in *) &arpreq.arp_pa;
memcpy(sin, &ss, sizeof(struct sockaddr_in));
strcpy(arpreq.arp_dev, "eth1");
arpreq.arp_ha.sa_family = AF_UNSPEC;
if (ioctl(sockfd, SIOCGARP, &arpreq)
perror("ioctl SIOCGARP: ");
return -1;
}
ptr = (unsigned char *)arpreq.arp_ha.sa_data;
sprintf(buf,"%x:%x:%x:%x:%x:%x", *ptr, *(ptr+1), *(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5));
return 0;
}
相关文章
- 计算机网络基本原理复习选择题(答案)
- 二层交换机,三层交换机,四层交换机的区别
- 网络知识问答51题
- 密码学原理与应用课程设计 报告 王笑晗
- 网络安全各章题1
- 用iptales实现包过滤型防火墙(一)---web开发者手册
- 套接字和客户端服务器模式
- 电脑相关实用知识
- winsock控件的基本属性
- 4S企业网络安全及对策毕业论文
计算机网络基本原理 1. 在星型局域网结构中,连接文件服务器与工作站的设备是( ) A .调制解调器 B .交换器 C .路由器 D .集线器 2. 在OSI 七层结构模型中,处于数据链路层与运输层之间的是( ) A .物理层 B .网络层 ...
二层交换技术是发展比较成熟,二层交换机属数据链路层设备,可以识别数据包中的mac地 址信息,根据mac地址进行转发,并将这些mac地址与对应的端口记录在自己内部的一个地 址表中.具体的工作流程如下: (1) 当交换机从某个端口收到一个数据包 ...
问题1:局域网.广域网和公用网.专用网有什么关系? (返回) 答:局域网通常都是为某个单位所拥有.非本单位的人一般都无法使用本单位安装的局域网.因此,局域网一般都是专用网.当然,也有例外.例如,某大学的国家重点实验室中的局域网就可以供所有到 ...
H a r b i n I n s t i t u t e o f T e c h n o l o g y a t W e i h a i 密码学原理与应用 课程设计报告 设计题目: 密钥交换协议 班 级: 1204201 学 号: 120 ...
一.填空 网络安全发展过程经历了三个阶段,它们是().().(). 网络安全的要素,包括().().().().().(). 本文介绍了两种常见的网络安全模型,是:().(). PDRR 安全模型中的P .D .R .R 分别代表().() ...
摘要:本文介绍linux2.4.x内核中的防火墙工具--iptables的原理与配置,同时还给出了实际运用的例子,在文章的最后归纳了iptables与ipchains的区别. 一. 概述 从1.1内核开始,linux就已经具有包过虑功能了, ...
目录: 1.什么是套接字? 2.如何创建套接字? 3.如何创建简单的服务器? 4.如何创建简单的客户端? 一 什么是套接字 很多教材中会讲解什么是套接字,这里我讲一下我的理解.我们想和另一个大楼的某个房间的美眉建立联系,可选的方案是知道对方 ...
我昨天刚刚弄完,先在地址栏里输入192.168.1.1,然后输入你的账户跟密码.可以进入到一个界面.坐标一排标题,应该有一个无线参数--基本设置.把安全类型改psk内个,然后在底下输入你的密码就行了.最好弄个大小写混输的,不然容易被人家破解 ...
一,WinSock简介 Socket(套接字)最初是由加利福尼亚大学Berkeley(伯克利)分校为UNIX妈作系统开发的网络通信接口,随着UNIX的广泛使 用,Socket成为当前最流行的网络通信应用程序接口之一.20世纪90年代初,由S ...
毕 业 论 文 院系名称 计算机管理系 班 级 507451 学生姓名 支行 学号 31 指导教师 周 晶 时 间 2011年6月15日 摘要 因特网的迅猛发展给人们的生活带来了极大的方便,但同时因特网也面临着空前的威胁.因此,如何使用有效 ...