繁体   English   中英

在对recvfrom()的调用中使用了哪种字节序来存储信息

[英]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_sourceh_dest也都以big-endian格式存储吗?在这种情况下,recvfrom()函数将数据以big-endian格式存储到缓冲区是否有效(我无法在此功能的手册页中找到有关此的任何信息)?我认为由于rfc1042 ,这应该是正确的,但我不确定。

recvfrom从套接字读取数据并将其存储在缓冲区中,但它不处理数据:它将在收到数据时将其存储。 数据中值的顺序取决于网络协议。 大多数网络协议使用big-endian(“网络顺序”),因此recvfrom提供的数据通常是big-endian,但这不是recvfrom的结果。

在大多数情况下,应使用ntohsntohl适当地转换值,并按记录的顺序处理数组。 对于h_sourceh_dest ,记录的顺序实际上是big-endian。 如果您正在编写内核代码,通常可以使用宏或辅助函数来完成此操作。 甚至printk都具有%pM格式说明符来处理MAC地址。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM