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

 在机房连线的时候通常需要知道交换机的接口和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_xxx
        char              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_INET6
        unsigned short   sin_port;    // 2 bytes e.g. htons(3490)
        struct in_addr   sin_addr;     // 4 bytes see struct in_addr, below
        char             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 /*
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值