得到IP包的数据意义(简单实现例子)
1 #include <stdio.h>
2 #include <unistd.h>
3 #include <linux/if_ether.h>
4 #include <linux/ip.h>
5 #include <linux/udp.h>
6 #include <linux/types.h>
7
8 void show_mac(const unsigned char *data);
9 void show_ip(const unsigned char *data);
10 void show_arp(const unsigned char *data);
11 void show_udp(const unsigned char *data);
12 void show_tcp(const unsigned char *data);
13 void show_app(const unsigned char *data);
14
15 int main()
16 {
17 unsigned char data[1024] = {
18 0x00, 0x26, 0xc6, 0x41, 0x06, 0xb2, 0x00, 0x26,
19 0xc6, 0x39, 0x8c, 0x36, 0x08, 0x00, 0x45, 0x00,
20 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
21 0x7a, 0x90, 0xc0, 0xa8, 0x1f, 0x72, 0xc0, 0xa8,
22 0x1f, 0x7a, 0x94, 0x2b, 0x25, 0x37, 0x00, 0x0c,
23 0xa0, 0x6d, 0x77, 0x61, 0x6e, 0x67
24 };
25
26 show_mac(data);
27
28 }
29
30 void show_mac(const unsigned char *data)
31 {
32 struct ethhdr *eth = (struct ethhdr *)data;
33 printf("-------------物理层-------------\n");
34 printf("目的MAC地址: %02x:%02x:%02x:%02x:%02x:%02x\n",
35 eth->h_dest[0], eth->h_dest[1],
36 eth->h_dest[2], eth->h_dest[3],
37 eth->h_dest[4], eth->h_dest[5]
38 );
39 printf("源端MAC地址: %02x:%02x:%02x:%02x:%02x:%02x\n",
40 eth->h_source[0], eth->h_source[1],
41 eth->h_source[2], eth->h_source[3],
42 eth->h_source[4], eth->h_source[5]
43 );
44 printf("使用的协议: %04x\n\n", ntohs(eth->h_proto));
45 if(ntohs(eth->h_proto) == 0x0800)
46 show_ip(data);
47 if(ntohs(eth->h_proto) == 0x0806)
48 show_arp(data);
49 }
50 void show_ip(const unsigned char *data)
51 {
52 printf("-------------网络层-------------\n");
53
54 struct iphdr *ip = (struct iphdr *)(data + sizeof(struct ethhdr));
55 printf("版本号: %d\n", ip->version);
56 printf("IP首部长度: %d\n", (ip->ihl)*4);
57 printf("服务类型: %d\n", ip->tos);
58 printf("总长度: %d\n", ntohs(ip->tot_len));
59 printf("标识: %d\n", ip->id);
60 printf("片偏移: %d\n", ip->frag_off);
61 printf("生存时间: %d\n", ip->ttl);
62 printf("上层使用协议: %d\n", ip->protocol);
63 printf("首部检验和: %d\n", ip->check);
64 printf("源IP地址: %s\n", inet_ntoa(ip->saddr));
65 printf("目的IP地址: %s\n\n", inet_ntoa(ip->daddr));
66 if(ip->protocol == 6)
67 show_tcp(data);
68 if(ip->protocol == 17)
69 show_udp(data);
70 }
71 void show_arp(const unsigned char *data)
72 {
73
74 }
75 void show_udp(const unsigned char *data)
76 {
77 printf("-------------传输层-------------\n");
78 struct udphdr *udp = (struct udphdr *)(data + sizeof(struct ethhdr)+ sizeof(struct iphdr));
79 printf("源端口号: %d\n", htons(udp->source));
80 printf("目的端口号: %d\n", htons(udp->dest));
81 printf("UDP长度: %d\n", htons(udp->len));
82 printf("UDP检验和: %x\n\n", htons(udp->check));
83 show_app(data);
84 }
85 void show_tcp(const unsigned char *data)
86 {
87
88 }
89 void show_app(const unsigned char *data)
90 {
91 printf("-------------应用层-------------\n");
92 char *p = (char *)(data + sizeof(struct ethhdr)+ sizeof(struct iphdr)+sizeof(struct udphdr));
93 printf("数据:%s\n\n", p);
94
95 }
作者QQ:115124903,欢迎交流。
每一步踏出,都是一次探索,一次成长。
每一步踏出,都是一次探索,一次成长。

浙公网安备 33010602011771号