在机房连线的时候通常需要知道交换机的接口和pc端的网卡接口之间的对应关系,当然最直接的办法是通过IDC运维人工判断,贴标签等,但是这显然不是比较可取的方法

 其实通过LLDP协议我们就可以解决这个问题。

 首先我们创建一个sock,那么这个sock收上来的LLDP数据中肯定包括了交换机接口相关的信息,那么我们只需要判断这个报文是从哪一个接口收上来那么就可以得到一个对应关系了。

 SOCK_RAW原始套接字编程可以接收到本机网卡上的数据帧或者数据包,对于监听网络的流量和分析是很有作用的.经常使用的有2种方式创建这种socket:

  • socket(AF_INET, SOCK_RAW, IPPROTO_TCP|IPPROTO_UDP|IPPROTO_ICMP)发送接收ip数据包,不能用IPPROTO_IP,因为如果是用了IPPROTO_IP,系统根本就不知道该用什么协议),应该使用sockaddr类型的地址(但是我们一般都使用sockaddr_in类型填充目的端口和ip然后在发送的时候转换成sockaddr)。

    struct sockaddr {unsigned short    sa_family;    // 2 bytes address family, AF_xxxchar              sa_data[14];     // 14 bytes of protocol address
    };// IPv4 AF_INET sockets:struct sockaddr_in {short            sin_family;       // 2 bytes e.g. AF_INET, AF_INET6unsigned short   sin_port;    // 2 bytes e.g. htons(3490)struct in_addr   sin_addr;     // 4 bytes see struct in_addr, belowchar             sin_zero[8];     // 8 bytes zero this if you want to
    };
  • socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP|ETH_P_ARP|ETH_P_ALL))发送接收以太网数据帧,应该使用sockaddr_ll类型的地址。

    在linux中提供了PF_PACKET接口可以操作链路层的数据。
    例子:

    • 定义一个pf_packet = socket(PF_SOCKET, SOCK_RAW, htons(ETH_P_RARP));
      就可以利用函数sendto和recefrom来读取和发送链路层的数据包了(当然,发送ARP包,上面第三个参数要变为 htons(ETH_P_ARP),或者IP的包为ETH_P_IP,可查看文件/usr/include/linux/if_ether.h文件看到所有支持的协议),LLDP的协议是 0x88CC
    源文件为<linux/if_ether.h>  /* * These are the defined Ethernet Protocol ID's. */  #define ETH_P_LOOP 0x0060 /* Ethernet Loopback packet */  #define ETH_P_PUP 0x0200 /* Xerox PUP packet */  #define ETH_P_PUPAT 0x0201 /* Xerox PUP Addr Trans packet */  #define ETH_P_IP 0x0800 /* Internet Protocol packet */  #define ETH_P_X25 0x0805 /* CCITT X.25 */  #define ETH_P_ARP 0x0806 /* Address Resolution packet */  #define ETH_P_BPQ 0x08FF /* G8BPQ AX.25 Ethernet Packet*/  #define ETH_P_IEEEPUP 0x0a00 /* Xerox IEEE802.3 PUP packet */  #define ETH_P_IEEEPUPAT 0x0a01 /* Xerox IEEE802.3 PUP Addr Trans packet */  #define ETH_P_DEC 0x6000 /* DEC Assigned proto */  #define ETH_P_DNA_DL 0x6001 /* DEC DNA Dump/Load */  #define ETH_P_DNA_RC 0x6002 /* DEC DNA Remote Console */  #define ETH_P_DNA_RT 0x6003 /* DEC DNA Routing */  #define ETH_P_LAT 0x6004 /* DEC LAT */  #define ETH_P_DIAG 0x6005 /* DEC Diagnostics */  #define ETH_P_CUST 0x6006 /* DEC Customer use */  #define ETH_P_SCA 0x6007 /* DEC Systems Comms Arch */  #define ETH_P_RARP 0x8035 /* Reverse Addr Res packet */  #define ETH_P_ATALK 0x809B /* Appletalk DDP */  #define ETH_P_AARP 0x80F3 /* Appletalk AARP */  #define ETH_P_IPX 0x8137 /* IPX over DIX */  #define ETH_P_IPV6 0x86DD /* IPv6 over bluebook */  #define ETH_P_PPP_DISC 0x8863 /* PPPoE discovery messages */  #define ETH_P_PPP_SES 0x8864 /* PPPoE session messages */  #define ETH_P_ATMMPOA 0x884c /* MultiProtocol Over ATM */  #define ETH_P_ATMFATE 0x8884 /* Frame-based ATM Transport  * over Ethernet  */

 首先我们利用 ip link命令可以观察到每个网卡的编号和名称:

 
比如网卡eth7的编号就为3.
在sock的协议中有这样一个addr_ll结构体,用来表示设备无关的物理层地址结构(在头文件linux/netdevice.h中)

    struct sockaddr_ll {unsigned short  sll_family;//地址族,类似sa_family__be16          sll_protocol;//上层的协议类型int             sll_ifindex;//网卡设备的索引号unsigned short  sll_hatype;//ARP 硬件地址类型unsigned char   sll_pkttype;//包含分组类型unsigned char   sll_halen;//物理层地址长度unsigned char   sll_addr[8];//物理层地址};

 其中我们主要关注的是ifindex就是网卡设备的索引号,还有两个结构体记录了网卡接口相关的信息(用来配置和获取ip地址,掩码,MTU,设备号,设备名等接口信息的,)

某个接口的相关信息:

    /* Interface request structure used for socket ioctl's. All interface ioctl's must have parameter definitions which begin with ifr_name. The remainder may be interface specific. */  struct ifreq  {  # define IFHWADDRLEN 6  # define IFNAMSIZ IF_NAMESIZE  union  {  char ifrn_name[IFNAMSIZ]; /* Interface name, e.g. "en0". */  } ifr_ifrn;  union  {  struct sockaddr ifru_addr;  struct sockaddr ifru_dstaddr;  struct sockaddr ifru_broadaddr;  struct sockaddr ifru_netmask;  struct sockaddr ifru_hwaddr;  short int ifru_flags;  int ifru_ivalue;  int ifru_mtu;  struct ifmap ifru_map;  char ifru_slave[IFNAMSIZ]; /* Just fits the size */  char ifru_newname[IFNAMSIZ];  __caddr_t ifru_data;  } ifr_ifru;  };  # define ifr_name ifr_ifrn.ifrn_name /* interface name */  # define ifr_hwaddr ifr_ifru.ifru_hwaddr /* MAC address */  # define ifr_addr ifr_ifru.ifru_addr /* address */  # define ifr_dstaddr ifr_ifru.ifru_dstaddr /* other end of p-p lnk */  # define ifr_broadaddr ifr_ifru.ifru_broadaddr /* broadcast address */  # define ifr_netmask ifr_ifru.ifru_netmask /* interface net mask */  # define ifr_flags ifr_ifru.ifru_flags /* flags */  # define ifr_metric ifr_ifru.ifru_ivalue /* metric */  # define ifr_mtu ifr_ifru.ifru_mtu /* mtu */  # define ifr_map ifr_ifru.ifru_map /* device map */  # define ifr_slave ifr_ifru.ifru_slave /* slave device */  # define ifr_data ifr_ifru.ifru_data /* for use by interface */  # define ifr_ifindex ifr_ifru.ifru_ivalue /* interface index */  # define ifr_bandwidth ifr_ifru.ifru_ivalue /* link bandwidth */  # define ifr_qlen ifr_ifru.ifru_ivalue /* queue length */  # define ifr_newname ifr_ifru.ifru_newname /* New name */  # define _IOT_ifreq _IOT(_IOTS(char),IFNAMSIZ,_IOTS(char),16,0,0)  # define _IOT_ifreq_short _IOT(_IOTS(char),IFNAMSIZ,_IOTS(short),1,0,0)  # define _IOT_ifreq_int _IOT(_IOTS(char),IFNAMSIZ,_IOTS(int),1,0,0)  

PC上所有接口的相关信息,其实就是pc上的所有ifreq串起来成一个链表

    struct ifconf{lint ifc_len;union{caddr_t  ifcu_bufStruct   ifreq *ifcu_req;}ifc_ifcu}#define    ifc_buf    ifc_ifcu.ifcu_buf#define    ifc_req    ifc_ifcu.ifcu_req

 这里我们需要用的就是ifreq结构体,通过他得到想要的接口名,那么我们就可以编程得到交换机接口和pc网卡接口对应起来了。

    /*buf[]收到的就是LLDP相关信息addr.sll_ifindex就是设备的编号ifr.ifr_name就是设备名*/  int main(int argc, char *argv[]){struct ifreq ifr={0,};int sock = socket(PF_PACKET, SOCK_RAW, htons(0x88cc));struct sockaddr_ll addr = {0,};//其中的sll_ifindex是我们需要的int addr_len = sizeof(addr);char buf[1024];while(sock >= 0){if(recvfrom(sock, buf, sizeof(buf), 0, (void *)&addr, &addr_len) > 0){ifr.ifr_ifindex = addr.sll_ifindex;(void)ioctl(sock, SIOCGIFNAME, &ifr);通过ifr_ifindex得到ifr_name就是设备名}}return 0;}

获取交换机和PC网卡接口对应关系相关推荐

  1. zabbix怎么显示服务器流量,用zabbix的自动发现来获取交换机路由器等接口流量信息...

    前言 笔者之前一直用zabbix监控服务器的各项状态,最近老板交待一项新工作,监控类似交换机.路由器之类的网络设备的接口流量.老板的要求就是职工的需求,立即开始监控准备工作.为了统一管理,决定还是使用 ...

  2. python中,获取设备网卡接口(ethx, mgmt)

    ls -l /sys/class/net/ | grep -v virtual | sed '1d' | awk 'BEGIN {FS="/"} {print $NF}' 命令在l ...

  3. linux 获取网卡接口信息

    linux 获取网卡接口信息 获取本机所有网卡名称 struct ifreq ioctl 头文件 获取网卡信息 获取本机所有网卡名称 // /usr/include/net/if.h, 头文件 < ...

  4. linux用c++获取mac地址,网卡地址,网口地址,网卡序号ip地址,不使用 ioctl(sock, SIOCGIFCONF, ifc)获取网络接口名称,这个接口有时会返回-1获取不到,换方法获取

    linux用c++获取mac地址,不使用 ioctl(sock, SIOCGIFCONF, &ifc)获取网络接口名称,这个接口有时会返回-1获取不到,换方法获取 1.弃用 SIOCGIFCO ...

  5. 基于NVIDIA QM8700/8790交换机与HDR网卡的InfiniBand高性能网络解决方案

    水之积也不厚,则其负大舟也无力,如果将高性能计算.机器学习.大数据.云.web 3.0 .存储平台等应用看作"舟",那InfiniBand网络无疑是承载这些大舟的水.随着数据的爆发 ...

  6. 基于交换机的PC端网络通信

    1. 通信环境 \qquad 两台电脑:一台是windows10操作系统,一台是Ubuntu操作系统: \qquad 一个5口的交换机和配套的交换机电源线 \qquad 两根网线 2.实现的目的 \q ...

  7. 光纤网卡千兆和万兆、光口和电口之间的区别?与PC网卡、HBA卡的区别有哪些?

    网卡是一个宽泛的名词,百科上定义的网卡是一块被设计用来允许计算机在计算机网络上进行通讯的计算机硬件.按照传输协议的不同,网卡可分为以太网卡.FC网卡.ISCSI网卡.以太网卡也称光纤网卡 ,主要插在服 ...

  8. 钉钉二次开发-组织机构同步 获取用户信息 单点登录接口

    建用户 调试工具:在线调试 请求方式:POST(HTTPS) 请求地址:https://oapi.dingtalk.com/user/create?access_token=ACCESS_TOKEN ...

  9. Wintun:一款惊艳的 WireGuard 虚拟网卡接口驱动

    公众号关注 「奇妙的 Linux 世界」 设为「星标」,每天带你玩转 Linux ! 前一段时间,一直在找寻 Windows 操作系统上的虚拟网卡接口,主要是为了搭建隧道使用.但是 Windows 操 ...

  10. 通过seller_nick:店铺昵称获取京东店铺所有商品接口,京东店铺所有商品API接口,API接口返回参数接入方案

    一.京东店铺所有商品接口参数说明: 1.通过seller_nick:店铺昵称获取京东店铺所有商品接口,可以获取获得店铺的所有商品,宝贝ID, 商品详情页,商品标题,宝贝图片, 价格, 优惠价,销量,商 ...

最新文章

  1. 鸿蒙系统搁置,华为:我们将坚定的支持安卓生态,鸿蒙系统没有明确上市时间...
  2. UVa197 - Cube(TLE)
  3. CodeForces - 1323D Present(思维+数学)
  4. Java设计模式学习总结(12)——结构型模式之外观模式
  5. 学术族谱典型用户及典型场景模拟
  6. Java Web开发实战(二)—Tomcat安装及环境变量配置
  7. java删除文件内容_java 删除文件中的数据
  8. 记一次jenkins构建无权限问题
  9. UNIX网络编程卷一 学习笔记 第一章 简介
  10. html5 for vs2008插件,Chart 控件 for vs2008的安装
  11. 灰度发布和AB test
  12. 阿里巴巴重要开源项目汇总
  13. IDEA工具上传项目报:Push rejected: Push to origin/master was rejected
  14. 高通平台msm8916修改开机logo 高通平台修改LK(bootloader)开机logo
  15. 爱奇艺校招笔试题 数字游戏
  16. NRF51802 PIN对PIN兼容NRF51822,主要的区别在于功耗
  17. 2022年全球市场汽车租赁行业发展前景分析及市场需求调研报告
  18. CCRC信息安全服务资质认证涨价了?最新规定已发布,重点已经给你们划好了~
  19. 【系统收藏】黑白美女xp主题
  20. 保密协议无效认定_签署了竞业限制协议,离职后只能被逼转行吗?详细解析竞业限制...

热门文章

  1. C语言将十进制输出二进制、八进制、十六进制的方法总结
  2. Android应用去广告方法盘点
  3. 【Unity】超级坦克大战(十三)闯关流程:关卡界面逻辑
  4. win7 定时开关机命令
  5. 【渝粤教育】国家开放大学2018年秋季 0284-21T外国文学 参考试题
  6. Tic tac toe井字棋游戏python实现
  7. 知识分享之Golang——一个常见word、excel转换pdf的工具函数
  8. 《哈利·波特与混血王子》(Harry Potter and the Half-Blood Prince)[DVDRip]
  9. windows终端终端_Windows终端机完整指南
  10. 12个思维导图工具,像数据科学家一样结构化地思考