我正在寻找有关如何在Linux上使用GNU LibC的原始套接字API的文档 .

到目前为止,我已阅读以下手册页:

man 7 ip
man 7 raw
man 7 socket

看着 netinet/ip.h Headers ,我发现有一个 struct iphdr 定义 . 但是,无论是在GNU LibC Manual中,还是在上述任何手册页中,我都找不到有关如何使用此API的任何信息 . 具体来说,如何将通过SOCK_RAW套接字接收的IP包解析为iphdr结构,以及如何访问各个位字段 .

看看 Headers 我看到它区分版本的endianess和 Headers 长度字段,但我不明白如何提取其他字段,如
如:

  • 优先级和服务类型(6位和2位)

  • 标志和片段偏移量(3和13位)

如果有可用于解析这些字段的宏,那么我会假设它们被记录在某处?我在哪里可以找到这样的文档 .

我还要验证我的假设,我可以简单地使用通过 recvfrom 收到的 char *buffer 并通过强制转换将其分配给 struct iphdr ,如下所示:

char *buffer;
recvfrom (raw_socket_fd, buffer, ...);

struct iphdr* ipPacket;
ipPacket = (struct iphdr*) buffer;

我错过了什么或者这个 Headers 没有在任何地方记录?

我的问题是 mainly about where this is documented . 但是,关于如何解析上述位字段的代码示例也将受到欢迎 .