调用recvfrom()的存储字节序及struct ethhdr成员格式有效性确认
关于recvfrom()存储信息的字节序与ethhdr->h_proto格式的解答
1. recvfrom()存储信息的字节序
当你使用原始套接字(SOCK_RAW)调用recvfrom()时,它会原封不动地把网络上传输的字节流保存到指定的buffer中。由于网络传输统一采用大端字节序(网络字节序),所以buffer里的数据自然也遵循大端序。Socket API在原始套接字模式下不会对数据做任何字节序转换,完全保留网络传输时的原始格式。
2. struct ethhdr的h_proto以大端格式存储是否合理?
这个存储方式完全合理,原因如下:
- 以太网帧的协议类型字段(对应
ethhdr->h_proto)在网络传输规范里就定义为大端字节序; - 原始套接字接收到的数据直接继承了这个网络格式,所以结构体里的
h_proto成员自然是大端序; - 你贴的代码里用
ntohs(eth->h_proto)转换后再打印,也正好验证了这一点——ntohs()的作用就是把大端序的16位数据转换成主机字节序(大部分主机是小端序,比如x86架构),这样才能在本地正确解析和显示协议类型值。
另外补充个小细节:代码里创建套接字时用了htons(ETH_P_ALL),这是把主机序的ETH_P_ALL转换成网络序传给socket(),和recvfrom的处理逻辑形成对应——发送/配置时要转成网络序,接收时要转回到主机序。
内容的提问来源于stack exchange,提问作者dmytro.poliarush
相关产品推荐
相关产品推荐

