博客地址:http://home.cnblogs.com/u/zengjianrong/

  在内核处理此流程,反而更加简单些,代码如下:

#include <net/arp.h>
#include <net/neighbour.h>
#include "linux/ctype.h" #define MAC_BCAST_ADDR (unsigned char *)"\xff\xff\xff\xff\xff\xff" /******************************************************************************
* nArpTblCtl - find mac from arp_tbl by ip
* DESCRIPTION: -
* Input:
* Output:
* Returns: -EAGAIN -- find nothing, but had send arp request.try again.
* -ENXIO -- find nothing, and create error.
* 0 -- find ok.
* modification history
* --------------------
* 2.00, 2014-12-18 , zengjianrong written
* --------------------
******************************************************************************/
static int nArpTblCtl(struct net_device *dev, const __be32 s_addr_remote, const __be32 s_addr_local, const unsigned char *pucMac)
{
struct arpreq arpreq;
struct sockaddr_in *sin = NULL;
struct neighbour *neigh = NULL;
unsigned char *hw_addr = NULL;
int err = -ENXIO; /* NO such device or address */ if (( == s_addr_remote)
|| (NULL == pucMac)
|| (NULL == dev))
{
err = -EINVAL;/* INVALID ARGUMENT */
return err;
} memset(&arpreq, , sizeof(struct arpreq));
sin = (struct sockaddr_in *) &(arpreq.arp_pa);
sin->sin_family = AF_INET;
memcpy(&(sin->sin_addr.s_addr), &s_addr_remote, sizeof(__be32));
strcpy(arpreq.arp_dev, dev->name); rtnl_lock();
if (neigh = neigh_lookup(&arp_tbl, &s_addr_remote, dev))
{
read_lock_bh(&neigh->lock);
memcpy(arpreq.arp_ha.sa_data, neigh->ha, dev->addr_len);
read_unlock_bh(&neigh->lock);
neigh_release(neigh); hw_addr = (unsigned char *) arpreq.arp_ha.sa_data;
memcpy(pucMac, hw_addr, );
if (!( == pucMac[] && == pucMac[] && == pucMac[]
&& == pucMac[] && == pucMac[] && == pucMac[]))
{
err = ;
}
}
else
{
if (neigh = neigh_create(&arp_tbl, &s_addr_remote, dev))
{
arp_send(ARPOP_REQUEST, ETH_P_ARP, s_addr_remote, netdev_eth1, s_addr_local,
MAC_BCAST_ADDR, netdev_eth1->dev_addr, NULL);
err = -EAGAIN; /* try again */
}
}
rtnl_unlock(); return err;
}
static int inet_aton(cp, addr)
const char *cp;
struct in_addr *addr;
{
u_long parts[];
uint32_t val;
const char *c;
char *endptr;
int gotend, n; c = (const char *)cp;
n = ;
/*
* Run through the string, grabbing numbers until
* the end of the string, or some error
*/
gotend = ;
while (!gotend)
{
unsigned long l; l = simple_strtoul(c, &endptr, ); if (l == ULONG_MAX || (l == && endptr == c))
return (); val = (uint32_t)l;
/*
* If the whole string is invalid, endptr will equal
* c.. this way we can make sure someone hasn't
* gone '.12' or something which would get past
* the next check.
*/
if (endptr == c)
return ();
parts[n] = val;
c = endptr; /* Check the next character past the previous number's end */
switch (*c)
{
case '.' :
/* Make sure we only do 3 dots .. */
if (n == ) /* Whoops. Quit. */
return ();
n++;
c++;
break; case '\0':
gotend = ;
break; default:
if (isspace((unsigned char)*c))
{
gotend = ;
break;
}
else
return (); /* Invalid character, so fail */
} } /*
* Concoct the address according to
* the number of parts specified.
*/ switch (n)
{
case : /* a -- 32 bits */
/*
* Nothing is necessary here. Overflow checking was
* already done in strtoul().
*/
break;
case : /* a.b -- 8.24 bits */
if (val > 0xffffff || parts[] > 0xff)
return ();
val |= parts[] << ;
break; case : /* a.b.c -- 8.8.16 bits */
if (val > 0xffff || parts[] > 0xff || parts[] > 0xff)
return ();
val |= (parts[] << ) | (parts[] << );
break; case : /* a.b.c.d -- 8.8.8.8 bits */
if (val > 0xff || parts[] > 0xff || parts[] > 0xff ||
parts[] > 0xff)
return ();
val |= (parts[] << ) | (parts[] << ) | (parts[] << );
break;
} if (addr != NULL)
addr->s_addr = htonl(val);
return ();
} int nArpTestByZjr(void)
{
struct in_addr sin_local_addr;
struct in_addr sin_remote_addr;
unsigned char aucMac[];
memset(aucMac, , );
memset(&sin_remote_addr, , sizeof(struct in_addr));
if ( == (inet_aton("200.31.96.225", &sin_remote_addr)))
{
printk("%s: IP address '200.31.96.225' not valid\n", __FUNCTION__);
return -;
}
memset(&sin_local_addr, , sizeof(struct in_addr));
if ( == (inet_aton("200.31.96.1", &sin_local_addr)))
{
printk("%s: IP address '200.31.96.1' not valid\n", __FUNCTION__);
return -;
} if ( > nArpTblCtl(netdev_eth1, sin_remote_addr.s_addr, sin_local_addr.s_addr, &aucMac))
{
printk("func:%s,line:%d, find nothing...\n", __FUNCTION__, __LINE__);
}
else
{
printk("200.31.96.225-->%02x:%02x:%02x:%02x:%02x:%02x\n",
aucMac[], aucMac[], aucMac[], aucMac[], aucMac[], aucMac[]);
}
}
EXPORT_SYMBOL(nArpTestByZjr);

通过IP获取MAC地址例子(内核层)的更多相关文章

  1. 通过IP获取MAC地址例子(应用层)

    博客地址:http://home.cnblogs.com/u/zengjianrong/ 由于某种需求,需要获取某个ip的mac地址,在应用层实现例子如下代码. 流程:1. 先遍历arp表,若存在对应 ...

  2. java根据本地Ip获取mac地址

    import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; impo ...

  3. android获取Mac地址和IP地址

    获取Mac地址实际项目中测试了如下几种方法:(1)设备开通Wifi连接,获取到网卡的MAC地址(但是不开通wifi,这种方法获取不到Mac地址,这种方法也是网络上使用的最多的方法) //根据Wifi信 ...

  4. Java获取本机的IP与MAC地址

    有些机器有许多虚拟的网卡,获取IP地址时会出现一些意外,所以需要一些验证: // 获取mac地址 public static String getMacAddress() { try { Enumer ...

  5. .net获取IP和MAC地址

    获取IP  解决request.UserHostAddress取不到真实IP private string GetClientIP()   {    string result = HttpConte ...

  6. 获取平台所有接口的IP和MAC地址

    我们有时候会有获取网口的IP和MAC地址的需求.可以通过ioctl来获取. #include <sys/ioctl.h>#include <net/if.h>#include ...

  7. 获取本机IP、mac地址、计算机名

    python获取本机IP.mac地址.计算机名 在python中获取ip地址和在php中有很大不同,我们先来看一下python 获得本机MAC地址: >>> import uuid ...

  8. Java根据ip地址获取Mac地址,Java获取Mac地址

    Java根据ip地址获取Mac地址,Java获取Mac地址 >>>>>>>>>>>>>>>>>&g ...

  9. Linux 获取本机IP、MAC地址用法大全

    getifaddrs()和struct ifaddrs的使用,获取本机IP ifaddrs结构体定义如下: struct ifaddrs { struct ifaddrs *ifa_next; /* ...

随机推荐

  1. 使用Debug Diagnostic Tool排除内存泄漏故障

    在我之前的博文中(SQL Server内存泄漏),我解释了如何使用“!heap”命令识别哪个模块泄漏了内存.有时我们使用“!d”命令来找到模型或者使用搜索内存命令(s)不能通过显示内存找到原因. 在这 ...

  2. linux系统下安装配置Jenkins

    准备java 环境 安装java sdk yum -y install java 验证是否安装成功 java -version 下载安装jenkins 官网:https://wiki.jenkins- ...

  3. Vue Stomp+SocketJS 数据报错[Object object]

    开头一句mmp tmd换位置了也没个提示!!!! 坑死爹了 <template> <div> <input type="text" v-model=& ...

  4. Django基本知识

    一.安装及使用 下载安装 命令行:pip3 install django==1.11.21 pycharm 创建项目 命令行: 找一个文件夹存放项目文件,打开终端: django-admin star ...

  5. 如何使用wce进行hash注入

    在内网渗透时,很经常会碰到好不容易提取出了hash,但是无法破解. wce号称内网渗透神器,其中有一个功能就是hash注入. 测试环境: 目标  windows2008 [192.168.200.12 ...

  6. ConstraintLayout 用法

    当前描述是基于constraint-layout:1.1.2. 一.前言 在以前,android是使用布局如LinearLayout .RelativeLayout等来构建页面,但这些布局使用起来很麻 ...

  7. 智能家居-2.基于esp8266的语音控制系统(硬件篇)

    智能家居-1.基于esp8266的语音控制系统(开篇) 智能家居-2.基于esp8266的语音控制系统(硬件篇) 智能家居-3.基于esp8266的语音控制系统(软件篇) 赞赏支持 QQ:505645 ...

  8. LeeCode——Second Highest Salary

    Write a SQL query to get the second highest salary from the Employee table. +----+--------+ | Id | S ...

  9. tornado 文件上传

    服务端 def post(self, *args, **kwargs): # content_type # filename # body file_data=self.request.files i ...

  10. 201871010114-李岩松《面向对象程序设计(java)》第十五周学习总结

    项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...