dmy*_*ush 0 networking c socket
我正在编写一个简单的数据包处理程序。这是代码摘录:
void print_ethernet_header(unsigned char* buffer)
{
struct ethhdr *eth = (struct ethhdr *)buffer;
fprintf(logfile , " |-Protocol : %x \n",eth->h_proto);
}
Run Code Online (Sandbox Code Playgroud)
这个简单的函数应该将协议类型的十六进制值打印到日志文件。确实它确实打印了值“8”。但是,在源 /usr/include/net/ethernet.h 和在线(https://en.wikipedia.org/wiki/EtherType)中,我看到 IP 协议类型定义为 0x0800。所以我实际上希望看到值 800(十六进制)或 2048(十进制)被打印到文件,而不是 8。我认为这可能与字节顺序有关,并且需要从网络字节顺序转换为主机,但在 recvfrom() 手册页中没有找到任何关于此的信息。这是填充缓冲区变量的调用:
sock_raw = socket(AF_PACKET,SOCK_RAW,htons(ETH_P_ALL));
//some code here...
data_size = recvfrom(sock_raw , buffer , bufsize , 0 , (struct sockaddr*)&saddr , (socklen_t*)&saddr_size);
Run Code Online (Sandbox Code Playgroud)
我使用的机器是 little-endian (Ubuntu 16.04)。为什么协议类型显示为 8 ?
结构定义表明这h_proto是一个大端 16 位整数:
struct ethhdr {
unsigned char h_dest[ETH_ALEN]; /* destination eth addr */
unsigned char h_source[ETH_ALEN]; /* source ether addr */
__be16 h_proto; /* packet type ID field */
} __attribute__((packed));
Run Code Online (Sandbox Code Playgroud)
因此,您确实需要ntohs在阅读之前对其进行处理。执行此操作后,您将看到正确的值 0x0800。
| 归档时间: |
|
| 查看次数: |
1019 次 |
| 最近记录: |