在机房连线的时候通常需要知道交换机的接口和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
- 定义一个pf_packet = socket(PF_SOCKET, SOCK_RAW, htons(ETH_P_RARP));
源文件为<linux/if_ether.h>
/*
* These are the defined Ethernet Protocol ID's.
*/
#define ETH_P_LOOP 0x0060 /*