在C中打印IP版本和IP标头

时间:2013-11-23 01:25:01

标签: c network-programming ip pcap

我有一个在C中编写数据包嗅探器的任务。目前提供的示例代码获取原始数据包并解析链路层(以太网)标头,如下所示:

struct ethernet_header {
   unsigned char dest[6];
   unsigned char source[6];
   char proto;
}

...



 const struct ethernet_header *header;
   header = (const struct ethernet_header *)data_packet;

   printf("Source MAC: %02x", header->source[0]);
   for (i = 1; i < 6; i++) printf(":%02x", header->source[i]);
   printf("\n");

...

现在我需要解析互联网层。 对于Internet Layer,我有以下结构:

struct ip_header {
        unsigned char  ip_vhl;          /* version << 4 | header length >> 2 */
        unsigned char  ip_tos;                 /* type of service */
        unsigned char  ip_len;                 /* total length */
...
};

现在ip_vhl是8位长,我想获得前4位并将其作为版本打印,最后4位将其作为标题长度打印。你能帮助我吗?

同样在示例代码中,他们使用%02x来printf header->source[i]%hu来printf header->proto。我真的很感激,如果有人能够解释它,我应该使用什么样的%..来打印ip_vhl,ip_tos和ip_len。

1 个答案:

答案 0 :(得分:0)

您有两种选择:

  • 使用位域来描述4位字段。注意实现和平台相关的位和字节排序:
struct foo {
   int bar:4;
   int baz:4;
}
  • 或使用逻辑运算来提取位。
upper4bits = (bigvar >> 4) & 0xf; 
lower4bits = bigvar & 0xf;