DHCPV6 开源代码如何获取MAC
DHCPv6代码使用数据包套接字,收到的报文已经剥除MAC帧头,所以无法获得对端client 的MAC地址。这边给出几个办法获取

  1. 使用原始套接字, 协议栈的原始套接字从实现上可以分为“链路层原始套接字”和“网络层原始套接字”两大类。链路层原始套接字可以直接用于接收和发送链路层的MAC帧,在发送时需要由调用者自行构造和封装MAC首部。而网络层原始套接字可以直接用于接收和发送IP层的报文数据,在发送时需要自行构造IP报文头。

    看到别人使用过,目的不是不仅仅为了获得MAC地址,可能为了提高收包效率吧。

  2. 通过sokcet获取对端MAC地址, 本人试了没有成功

 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;
}
  1. 使用本地的neigh list
#define MAC_STRING_LEN 18
#define IPV6_STRING_LEN 64
#define LINK_STATUS_LEN 16
#define ADDRESS_TYPE 16
int getIpv6ClientMac(char *mac, int macLen, char *ip6AddrDevice)
{int ret = -1;char cmd[128]; char buf[256];FILE *fp = NULL;char ipAddr[IPV6_STRING_LEN] = {0};char addrType[ADDRESS_TYPE] = {0};char macAddr[MAC_STRING_LEN] = {0};char linkStatus[LINK_STATUS_LEN] = {0};char *ip6Addr = NULL;if ((mac == NULL) || (ip6AddrDevice == NULL)){debug_printf(LOG_ERR, FNAME, "The Para is NULL");return -1;}memset(cmd, 0, sizeof(cmd));memset(buf, 0, sizeof(buf));ip6Addr = strtok(ip6AddrDevice, "%");/* get ipv6 neigh infor */snprintf(cmd, sizeof(cmd) - 1, "/bin/ip -6 neigh show dev br0");fp = popen(cmd, "r");if (fp == NULL){return -1;}while (fgets(buf, sizeof(buf), fp)){if (sscanf(buf, "%s %s %s %s", ipAddr, addrType, macAddr, linkStatus) == 4){if (strcmp(ipAddr, ip6Addr)== 0){strncpy(mac, macAddr, macLen);ret = 0;break;}}}pclose(fp);fp = NULL;return ret;
}

DHCPV6 开源代码如何获取device的MAC相关推荐

  1. tao的开源代码_获取并编译TAO

    如果您对TAO有一定了解,却不知如何驾驭它,那请跟我来从头学学TAO编译. 如果您对TAO还不是非常了解的话,请跟我来,一起对TAO有一个初步的认识. TAO简介 TAO (The ACE Orb) ...

  2. 从SourceForge上获取CVS管理的开源代码

    CVS 是一个 C/S 系统,多个开发人员通过一个中心版本控制系统来记录文件版本,从而达到保证文件同步的目的.CVS 版本控制系统是一种 GNU 软件包,主要用于在多人开发环境下的源码的维护. Tor ...

  3. 并注册烧写钩子 获取启动介质类型_鸿蒙OS开源代码精要解读之—— 系统服务框架子系统(服务启动)...

    鸿蒙OS开源代码精要解读之-- 系统服务框架子系统(服务启动) 作者介绍: 中科创达OpenHarmony研究组 说明: 中科创达OpenHarmony研究组第一时间对https://codechin ...

  4. 最新公开获取网站访客QQ开源代码成功率90%免费使用

    最新公开获取网站访客QQ开源代码成功率90%免费使用 最新公开获取网站访客QQ开源代码成功率90%免费使用 免费开源使用地址http://www.zzw666.com/getqq/index.php ...

  5. C++开源代码项目汇总

    Google的C++开源代码项目 v8  -  V8 JavaScript Engine V8 是 Google 的开源 JavaScript 引擎. V8 采用 C++ 编写,可在谷歌浏览器(来自 ...

  6. 网络ioctl实践1:获取网卡的MAC和IP

    网络ioctl实践1:获取网卡的MAC和IP 网络ioctl实践2:获取网卡的广播地址和子网掩码 网络ioctl实践3:设置网卡的mac.ip.子网掩码.广播地址 前言 如果设备控制没有好的解决办法, ...

  7. Windows编译开源代码方法之关于lame.exe文件的测试及过程

    Windows编译开源代码方法之关于lame.exe文件的测试及过程 最终结果(PS:使用markdown不熟悉,记得在井号后面加个空格才能触发) 起因:foobar2000在格式转换中需要lame. ...

  8. android优秀开源代码

    GitHub 优秀的 Android 开源项目 转自:http://blog.csdn.net/shulianghan/article/details/18046021 主要介绍那些不错个性化的Vie ...

  9. 开源代码托管平台GitCode怎么用?看这篇就够了

    关于GitHub,相信每个程序员都知道,它是一个基于Git实现的在线代码仓库,也是目前最大的代码托管平台.但知道和做到之间往往有道鸿沟,GitHub作为一个外文网站,因为一些众所周知的原因,国内经常无 ...

最新文章

  1. 【C++】Google C++编码规范(一):作用域
  2. BZOJ 3236[AHOI2013]作业
  3. windows安装go环境变量
  4. 在program A里访问program B local class的两种方式
  5. 招不到电子工程师,这锅谁来背?
  6. Animate.css
  7. base cap 分布式_分布式系统一致性问题、CAP定律以及 BASE 理论
  8. NGN学习笔记8——NGN的安全问题
  9. 1078 最小生成树
  10. java安卓软件开发菜鸟教程,Android 开发环境搭建
  11. Java生成桌面快捷方式(字节流生成)
  12. Rivaple 江枫 MC服务器文档(创新生存部分)
  13. 2012年陈乔恩主演都市胜女华丽猎爱偶像剧-胜女的代价
  14. 【科创人】快狗打车CTO沈剑:努力不会背叛,承担社会责任的企业胜算高一点点...
  15. imx6ull:uboot的make xxx_defconfig 过程分析
  16. 网站优化:SEO网站优化常识以及我如何学习?
  17. 实现登录和用户信息组件的按需展示
  18. c语言程序设计教程第二版张磊,C语言程序设计实验与实训指导及题解(第2版)-张磊...
  19. 【军工AI】基于图像处理与图像识别的经典探地雷达识别
  20. 转盘程序 使用松下XH PLC编程 用了威纶通TK6071IQ屏,PLC用的是松下XH的

热门文章

  1. Emulator: emulator: INFO: QtLogger.cpp:68: Critical: Uncaught ReferenceError: $ is not defined (qrc:
  2. 什么是框架?框架要解决的问题?
  3. 互联网早报:滴滴正式启动造车,滴滴副总裁、小桔车服总经理杨峻负责
  4. GrabCut图像分割
  5. 如何关闭电脑自动更新?
  6. ClasssLoader
  7. 在linux下安装chrome 浏览器
  8. ubuntu20.04 GPU基准测试
  9. 基础算法 - 树的直径
  10. 会话空闲时间已超过限度