[英]What endianess is used to store information in call to recvfrom()
这是套接字API中的简单代码:
sock_raw = socket(AF_PACKET,SOCK_RAW,htons(ETH_P_ALL));
//...
data_size = recvfrom(sock_raw , buffer , bufsize , 0 , (struct sockaddr*)&saddr , (socklen_t*)&saddr_size);
//...
void print_ethernet_header(unsigned char* buffer) { struct ethhdr *eth = (struct ethhdr *)buffer; fprintf(logfile , " |-Protocol : %x \\n",ntohs(eth->h_proto)); }
在这个问题中,我被解释为struct ethhdr
h_proto
成员以big-endian格式存储。 可以说此结构的其他成员( h_source
和h_dest
也都以big-endian格式存储吗?在这种情况下,recvfrom()函数将数据以big-endian格式存储到缓冲区是否有效(我无法在此功能的手册页中找到有关此的任何信息)?我认为由于rfc1042 ,这应该是正确的,但我不确定。
recvfrom
从套接字读取数据并将其存储在缓冲区中,但它不处理数据:它将在收到数据时将其存储。 数据中值的顺序取决于网络协议。 大多数网络协议使用big-endian(“网络顺序”),因此recvfrom
提供的数据通常是big-endian,但这不是recvfrom
的结果。
在大多数情况下,应使用ntohs
和ntohl
适当地转换值,并按记录的顺序处理数组。 对于h_source
和h_dest
,记录的顺序实际上是big-endian。 如果您正在编写内核代码,通常可以使用宏或辅助函数来完成此操作。 甚至printk
都具有%pM
格式说明符来处理MAC地址。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.