Main Page   Modules   Data Structures   File List   Data Fields   Globals   Related Pages  

basic_dump.c

Go to the documentation of this file.
00001 #include "pcap.h"
00002 
00003 /* prototype of the packet handler */
00004 void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data);
00005 
00006 main()
00007 {
00008 pcap_if_t *alldevs;
00009 pcap_if_t *d;
00010 int inum;
00011 int i=0;
00012 pcap_t *adhandle;
00013 char errbuf[PCAP_ERRBUF_SIZE];
00014     
00015     /* Retrieve the device list on the local machine */
00016     if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -1)
00017     {
00018         fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf);
00019         exit(1);
00020     }
00021     
00022     /* Print the list */
00023     for(d=alldevs; d; d=d->next)
00024     {
00025         printf("%d. %s", ++i, d->name);
00026         if (d->description)
00027             printf(" (%s)\n", d->description);
00028         else
00029             printf(" (No description available)\n");
00030     }
00031     
00032     if(i==0)
00033     {
00034         printf("\nNo interfaces found! Make sure WinPcap is installed.\n");
00035         return -1;
00036     }
00037     
00038     printf("Enter the interface number (1-%d):",i);
00039     scanf("%d", &inum);
00040     
00041     if(inum < 1 || inum > i)
00042     {
00043         printf("\nInterface number out of range.\n");
00044         /* Free the device list */
00045         pcap_freealldevs(alldevs);
00046         return -1;
00047     }
00048     
00049     /* Jump to the selected adapter */
00050     for(d=alldevs, i=0; i< inum-1 ;d=d->next, i++);
00051     
00052     /* Open the device */
00053     if ( (adhandle= pcap_open(d->name,          // name of the device
00054                               65536,            // portion of the packet to capture
00055                                                 // 65536 guarantees that the whole packet will be captured on all the link layers
00056                               PCAP_OPENFLAG_PROMISCUOUS,    // promiscuous mode
00057                               1000,             // read timeout
00058                               NULL,             // authentication on the remote machine
00059                               errbuf            // error buffer
00060                               ) ) == NULL)
00061     {
00062         fprintf(stderr,"\nUnable to open the adapter. %s is not supported by WinPcap\n", d->name);
00063         /* Free the device list */
00064         pcap_freealldevs(alldevs);
00065         return -1;
00066     }
00067     
00068     printf("\nlistening on %s...\n", d->description);
00069     
00070     /* At this point, we don't need any more the device list. Free it */
00071     pcap_freealldevs(alldevs);
00072     
00073     /* start the capture */
00074     pcap_loop(adhandle, 0, packet_handler, NULL);
00075     
00076     return 0;
00077 }
00078 
00079 
00080 /* Callback function invoked by libpcap for every incoming packet */
00081 void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data)
00082 {
00083     struct tm *ltime;
00084     char timestr[16];
00085     
00086     /* convert the timestamp to readable format */
00087     ltime=localtime(&header->ts.tv_sec);
00088     strftime( timestr, sizeof timestr, "%H:%M:%S", ltime);
00089     
00090     printf("%s,%.6d len:%d\n", timestr, header->ts.tv_usec, header->len);
00091     
00092 }

documentation. Copyright (c) 2002-2003 Politecnico di Torino. All rights reserved.