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("\r\n"); 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: \r\n"); 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("\r\nframe type: 0x%x\r\n", 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: \r\n"); 83 print_buf(pData, 20); 84 85 /* parse ip header */ 86 IPHeader_t* pIpHeader = (IPHeader_t*)pData; 87 printf("\tversion : %02x\r\n" 88 "\ttos : %02x\r\n" 89 "\ttotal length: %d(0x%02x)\r\n" 90 "\tid : %d(0x%02x)\r\n" 91 "\tsegment flag: %d(0x%02x)\r\n" 92 "\tttl : %02x\r\n" 93 "\tprotocol : %02x\r\n" 94 "\tchecksum : %d(0x%02x)\r\n" 95 "\tsrc ip : %d.%d.%d.%d\r\n" 96 "\tdst ip : %d.%d.%d.%d\r\n", 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: \r\n"); 117 print_buf(pData, 40); 118 119 /* parse ipv6 header */ 120 IPv6Header_t* pIpv6Header = (IPv6Header_t*)pData; 121 printf("\tversion : %x\r\n" 122 "\ttraffic class : %x\r\n" 123 "\tflow label : %x\r\n" 124 "\tpayload length : %x\r\n" 125 "\tnext header : %x\r\n" 126 "\thop limit : %x\r\n" 127 "\tsource : %x\r\n" 128 "\tdestination : %x\r\n", 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\r\n", ftype); 165 break; 166 } 167 168 printf("\r\n"); 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("--------------------------------------------\r\n"); 176 printf("Packet Count: %d\n", ++(*counter)); 177 printf("Received Packet Size: %d\n", pkthdr->len); 178 printf("Payload:\n"); 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("\n"); 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 已经结束\n"); 259 } 260 261 if(g_thread[1] !=0) 262 { //comment5 263 pthread_join(g_thread[1],NULL); 264 printf("线程2 已经结束\n"); 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\n", 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 }