zoukankan      html  css  js  c++  java
  • libpcap报文解析: ipv4、ipv6 @ 2014.7.2

      1 #include <string.h>
      2 #include <stdlib.h>
      3 #include <pcap.h>
      4 #include <stdio.h>
      5 #include <sys/time.h>
      6 #include <unistd.h>
      7 #include <netinet/in.h>
      8 #include <pthread.h>
      9 #include "packet_header.h"
     10 #include <iostream>
     11 #include <string>
     12 using namespace std;
     13 
     14 #define MAXBYTE2CAPTURE 2048
     15 
     16 pthread_t g_thread[2];
     17 pthread_mutex_t g_mutex;
     18 
     19 int isprint(char c)
     20 {
     21     return 0;
     22 }
     23 
     24 void print_buf(u_char* pBuf, u_int32 len)
     25 {
     26     if (!pBuf)
     27     {
     28         return;
     29     }
     30 
     31     for(int i=0; i<len; i++)
     32     {
     33         printf("%02x ",  (u_char*)pBuf[i]);
     34 
     35         if ((i%16 == 0 && i!=0) || i == len-1)
     36         {
     37             printf("
    ");
     38         }
     39     }
     40 }
     41 
     42 void parse_ethII(u_char* pData, u_int32 len)
     43 {
     44     if (!pData || len <14)
     45     {
     46         return;
     47     }
     48 
     49     printf("eth II frame: 
    ");
     50     print_buf(pData, 14);
     51 
     52     /* parse src mac and dst mac */
     53     EthHeader_t* pEth = (EthHeader_t*)pData;
     54     printf("destination: %02x:%02x:%02x:%02x:%02x:%02x ",
     55         pEth->dest_hwaddr[0],
     56         pEth->dest_hwaddr[1],
     57         pEth->dest_hwaddr[2],
     58         pEth->dest_hwaddr[3],
     59         pEth->dest_hwaddr[4],
     60         pEth->dest_hwaddr[5]);
     61 
     62     printf("source : %02x:%02x:%02x:%02x:%02x:%02x",
     63         pEth->source_hwaddr[0],
     64         pEth->source_hwaddr[1],
     65         pEth->source_hwaddr[2],
     66         pEth->source_hwaddr[3],
     67         pEth->source_hwaddr[4],
     68         pEth->source_hwaddr[5]);
     69 
     70     /* parse frame type */
     71     printf("
    frame type: 0x%x
    ", ntohs(pEth->frame_type));
     72 }
     73 
     74 
     75 void parse_ipheader(u_char* pData, u_int32 len)
     76 {
     77     if (!pData || len <14)
     78     {
     79         return;
     80     }
     81 
     82     printf("ip header: 
    ");
     83     print_buf(pData, 20);
     84 
     85     /* parse ip header */
     86     IPHeader_t* pIpHeader = (IPHeader_t*)pData;
     87     printf("	version     : %02x
    "
     88            "	tos         : %02x
    "
     89            "	total length: %d(0x%02x)
    "
     90            "	id          : %d(0x%02x)
    "
     91            "	segment flag: %d(0x%02x)
    "
     92            "	ttl         : %02x
    "
     93            "	protocol    : %02x
    "
     94            "	checksum    : %d(0x%02x)
    "
     95            "	src ip      : %d.%d.%d.%d
    "
     96            "	dst ip      : %d.%d.%d.%d
    ",
     97         pIpHeader->Ver_HLen,
     98         pIpHeader->TOS,
     99         ntohs(pIpHeader->TotalLen), ntohs(pIpHeader->TotalLen),
    100         ntohs(pIpHeader->ID), ntohs(pIpHeader->ID),
    101         ntohs(pIpHeader->Flag_Segment), ntohs(pIpHeader->Flag_Segment),
    102         pIpHeader->TTL,
    103         pIpHeader->Protocol,
    104         ntohs(pIpHeader->Checksum), ntohs(pIpHeader->Checksum),
    105         pIpHeader->SrcIP[0],pIpHeader->SrcIP[1],pIpHeader->SrcIP[2],pIpHeader->SrcIP[3],
    106         pIpHeader->DstIP[0],pIpHeader->DstIP[1],pIpHeader->DstIP[2],pIpHeader->DstIP[3]);
    107 }
    108 
    109 void parse_ip6header(u_char* pData, u_int32 len)
    110 {
    111     if (!pData || len <14)
    112     {
    113         return;
    114     }
    115 
    116     printf("ipv6 header: 
    ");
    117     print_buf(pData, 40);
    118 
    119     /* parse ipv6 header */
    120     IPv6Header_t* pIpv6Header = (IPv6Header_t*)pData;
    121     printf("	version           : %x
    "
    122            "	traffic class     : %x
    "
    123            "	flow label        : %x
    "
    124            "	payload length    : %x
    "
    125            "	next header       : %x
    "
    126            "	hop limit         : %x
    "
    127            "	source            : %x
    "
    128            "	destination       : %x
    ",
    129            pIpv6Header->ip6_ctlun.ip6_un2_vfc,
    130            pIpv6Header->ip6_ctlun.ip6_unl.ip6_unl_flow,
    131            pIpv6Header->ip6_ctlun.ip6_unl.ip6_unl_flow,
    132            pIpv6Header->ip6_ctlun.ip6_unl.ip6_unl_plen,
    133            pIpv6Header->ip6_ctlun.ip6_unl.ip6_unl_nxt,
    134            pIpv6Header->ip6_ctlun.ip6_unl.ip6_unl_hlim,
    135            pIpv6Header->ip6_src,
    136            pIpv6Header->ip6_dst);
    137 }
    138 
    139 
    140 void parse_packet(const u_char* packet, u_int32 len)
    141 {
    142     u_short ftype = 0;
    143 
    144     if (!packet)
    145     {
    146         return ;
    147     }
    148 
    149     u_char* pMbuf = (u_char*)packet;
    150     parse_ethII(pMbuf, len);
    151 
    152     ftype = ntohs(((EthHeader_t*)pMbuf)->frame_type);
    153     switch(ftype)
    154     {
    155         case 0x0800:  /* ipv4 */
    156             pMbuf = (u_char*)packet + 14;
    157             parse_ipheader(pMbuf, len-14);
    158             break;
    159         case 0x86dd: /* ipv6 */
    160             pMbuf = (u_char*)packet + 14;
    161             parse_ip6header(pMbuf, len-14);
    162             break;
    163         default:
    164             printf("frame type : 0x%x
    ", ftype);
    165             break;
    166     }
    167 
    168     printf("
    ");
    169 }
    170 
    171 void processPacket(u_char *arg, const struct pcap_pkthdr *pkthdr, const u_char *packet)
    172 {
    173     int i = 0, *counter = (int *)arg;
    174 
    175     printf("--------------------------------------------
    ");
    176     printf("Packet Count: %d
    ", ++(*counter));
    177     printf("Received Packet Size: %d
    ", pkthdr->len);
    178     printf("Payload:
    ");
    179 
    180 #if 1
    181     for (i = 0; i < pkthdr->len; i++)
    182     {
    183         if (isprint(packet[i]))
    184         {
    185             printf("%02d ", packet[i]);
    186         }
    187         else
    188         {
    189             printf("%02x ", packet[i]);
    190         }
    191 
    192         if ((i % 16 == 0 && i != 0) || i == pkthdr->len-1)
    193         {
    194             printf("
    ");
    195         }
    196 
    197     }
    198 #endif
    199 
    200     parse_packet(packet, pkthdr->len);
    201 
    202     return;
    203 }
    204 
    205 
    206 void* thread_recv_pkt(void *)
    207 {
    208     while(1)
    209     {
    210         cout << "recv pkt: " << endl;
    211         sleep(1);
    212     }
    213 }
    214 
    215 void* thread_send_pkt(void *)
    216 {
    217     while (1)
    218     {
    219         cout << "send pkt: " << endl;
    220         sleep(1);
    221     }
    222 }
    223 
    224 int create_pkt_process_task()
    225 {
    226     int ret = 0;
    227 
    228     memset(&g_thread, 0, sizeof(g_thread));
    229 
    230     ret = pthread_create(&g_thread[0], NULL, thread_send_pkt, NULL);
    231     if (0 == ret)
    232     {
    233         cout << "packet send thread create successfully." << endl;
    234     }
    235     else
    236     {
    237         cout << "packet send thread create failed." << endl;
    238     }
    239 
    240     ret = pthread_create(&g_thread[1], NULL, thread_recv_pkt, NULL);
    241     if (0 == ret)
    242     {
    243         cout << "packet send thread create successfully." << endl;
    244     }
    245     else
    246     {
    247         cout << "packet send thread create failed." << endl;
    248     }
    249 
    250     return 0;
    251 }
    252 
    253 void pkt_process_task_wait()
    254 {
    255     if(g_thread[0] !=0)
    256     {                   //comment4
    257        pthread_join(g_thread[0],NULL);
    258        printf("线程1 已经结束
    ");
    259     }
    260 
    261     if(g_thread[1] !=0)
    262     {                //comment5
    263         pthread_join(g_thread[1],NULL);
    264         printf("线程2 已经结束
    ");
    265     }
    266 }
    267 
    268 int main()
    269 {
    270 
    271     int i = 0, count = 0;
    272     pcap_t *descr = NULL;
    273     char errbuf[PCAP_ERRBUF_SIZE], *device = NULL;
    274 
    275     memset(errbuf, 0, PCAP_ERRBUF_SIZE);
    276 
    277     create_pkt_process_task();
    278     pkt_process_task_wait();
    279 
    280     /* Get the name of the first device suitable for capture */
    281     device = pcap_lookupdev(errbuf);
    282     if (!device)
    283     {
    284         printf("Open device failed.");
    285         return -1;
    286     }
    287 
    288     printf("Opening device %s
    ", device);
    289 
    290     /* Open device in promiscuous mode */
    291     descr = pcap_open_live(device, MAXBYTE2CAPTURE, 1, 512, errbuf);
    292 
    293     /* Loop forever & call processPacket() for every received packet */
    294     pcap_loop(descr, -1, processPacket, (u_char *)&count);
    295 
    296     return 0;
    297 }
  • 相关阅读:
    “无法从http://XXX/XXX.svc?wsdl获取元数据”错误的解决方法
    闹洞房小游戏
    第3章 Oracle实例的管理
    公积金余额查询电话
    人要有忧患意识
    第0章 Oracle的安装及相关配置
    第5章 重做日志文件
    oracle体系结构视频学习笔记
    编写存储过程实现查询mysql数据库中的表名并删除表中的数据
    第6章 表空间和数据文件的管理
  • 原文地址:https://www.cnblogs.com/kernel0815/p/3821425.html
Copyright © 2011-2022 走看看