On Apr 17, 2013, at 6:56 PM, wen lui <esolvepol...@gmail.com> wrote:

>        handle = pcap_open_live(dev, BUFSIZ, 0, 0, errbuf);
>        pcap_compile(handle, &fp, filter_exp, 0, mask) == -1
>        pcap_setfilter(handle, &fp);
>        struct pcap_pkthdr pcap_header;      // The header that pcap gives us
>        const u_char *pcap_packet;           // The actual packet
> 
>        while(1){
> 
>          n=fork();
>          if(n==0) { // child process
>                fd_set rdfds;
>                int pcap_fd = pcap_get_selectable_fd(pcap_handler);
>                for(;;){
>                        FD_ZERO(&rdfds);
>                        FD_SET(pcap_fd, &rdfds);
>                        FD_SET(sd_proxy, &rdfds);   // here is another fd
> 
>                        select(pcap_fd>sd_proxy?pcap_fd+1:sd_proxy+1,&rdfds, 
> NULL, NULL, NULL)

Yes, that's at least a start at writing the kind of code needed for

        
http://stackoverflow.com/questions/16067015/blocking-pcap-and-multiple-i-o-select

You should be checking the return value of select() for errors, and reporting 
errors if they occur, just to be sure.

>From the

>        struct pcap_pkthdr pcap_header;      // The header that pcap gives us
>        const u_char *pcap_packet;           // The actual packet

I suspect you're using pcap_next() or pcap_next_ex().

If you're going to use them with select(), you have to use them in a very 
specific way.

First of all, you need to put the pcap_t in non-blocking mode.  After the 
pcap_open_live() call, do:

        if (pcap_setnonblock(handle, 1, errbuf) == -1) {
                fprintf(stderr, "pcap_setnonblock failed: %s\n", errbuf);
                exit(2);
        }

Then, of course, you check rdfds; if the bit for pcap_fd is set, do:

                for (;;) {
                        switch (pcap_next_ex(handle, &pcap_header, 
&pcap_packet)) {

                        case -1:
                                /* Error */
                                fprintf(stderr, "pcap_next_ex failed: %s\n", 
pcap_geterr(handle));
                                exit(2);
                                break;

                        case 0:
                                /* No more packets to read for now */
                                goto done;

                        case -2:
                                /* Somebody called pcap_breakloop() */
                                goto done;

                        default:
                                /* Process the packet */
                                do whatever you do with pcap_header and 
pcap_packet;
                                break;
                }
        done:
                ;

The "case -2" case can be left out if you don't call pcap_breakloop() in your 
program.

_______________________________________________
tcpdump-workers mailing list
tcpdump-workers@lists.tcpdump.org
https://lists.sandelman.ca/mailman/listinfo/tcpdump-workers

Reply via email to