socket_RAW 返回的数据包结构
时间: 2023-08-02 11:32:55 浏览: 90
使用 `socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL))` 创建的原始套接字返回的数据包结构如下:
```c
struct sockaddr_ll {
unsigned short sll_family; // Always AF_PACKET
unsigned short sll_protocol; // Network protocol ( htons(ETH_P_IP)、htons(ETH_P_ARP)、htons(ETH_P_ALL) 等)
int sll_ifindex; // Interface index
unsigned short sll_hatype; // ARP hardware type, usually ARPHRD_ETHER
unsigned char sll_pkttype; // Packet type (PACKET_HOST、PACKET_BROADCAST、PACKET_MULTICAST、PACKET_OTHERHOST、PACKET_OUTGOING等)
unsigned char sll_halen; // Length of address
unsigned char sll_addr[8]; // Physical layer address
};
```
其中,`sll_family` 始终为 `AF_PACKET`,`sll_protocol` 表示网络协议类型,与创建原始套接字时设置的协议类型一致,`sll_ifindex` 表示接口的索引,`sll_hatype` 表示 ARP 硬件类型,通常为 `ARPHRD_ETHER`,`sll_pkttype` 表示数据包类型,包括 `PACKET_HOST`、`PACKET_BROADCAST`、`PACKET_MULTICAST`、`PACKET_OTHERHOST`、`PACKET_OUTGOING` 等,`sll_halen` 表示物理地址的长度,`sll_addr` 表示物理地址。
在数据包的数据部分,前面是链路层头,可以通过 `struct ethhdr` 结构体来解析,后面是网络层及以上的协议数据,需要根据协议类型进行解析。
阅读全文