首页 > 代码库 > 得到IP包的数据意义(简单实现例子)
得到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 }
得到IP包的数据意义(简单实现例子)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。