我正在寻找有关如何在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 . 但是,关于如何解析上述位字段的代码示例也将受到欢迎 .