On Apr 7, 2013, at 2:47 PM, Ahmed Elshaer <[email protected]> wrote:

> what is the difference between
> pcap_open     and pcap_open_live

pcap_open() supports some options that pcap_open_live() doesn't, such as 
providing a user name and password for remote capture, some flags for remote 
capture, and an option to return packets as soon as they arrive.

If you don't need any of the options that pcap_open() supports, and want your 
code to be portable to non-Windows systems, pcap_open_live() is the best 
choice.  pcap_open_live() is also a bit simpler to call. If you need those 
options, pcap_open() is the best choice.

> findalldevs_ex and findalldevs

pcap_findalldevs_ex() can ask a remote machine running the rpcap service what 
devices it has to capture on; pcap_findalldevs() can only check for local 
devices.

If you don't need to support capturing from interfaces attached to other 
machines, and want your code to be portable to non-Windows systems, 
pcap_findalldevs() is the best choice.  It is also a bit simpler to call.  If 
you want to support capturing on interfaces attached to other machines, 
pcap_findalldevs_ex() is the best choice.

> pacap_loop     and pcap_dispatch and pcap_next_ex

pcap_loop() will keep reading packets until the specified count runs out or 
pcap_breakloop() is called (in another thread).

pcap_dispatch() will do at most one blocking call into the OS per call to 
pcap_dispatch(); it's primarily intended for use when your program has a main 
loop using calls such as select()/poll()/etc. on UN*X or 
WaitForMultipleObjects()/MsgWaitForMultipleObjects() on Windows, so that the 
main loop is handling both packets and other things (network connections, 
devices, window system input events).

Both pcap_loop() and pcap_dispatch() use callbacks to supply packets, and 
pcap_next_ex(), in effect, calls pcap_loop() with a count of 1 with its own 
callback that fills in some information that it then returns.  pcap_loop() and 
pcap_dispatch() might thus have less overhead, but you have to supply a 
callback rather than doing something simpler such as

        for (;;) {
                get a packet with pcap_next_ex();
                if (error) {
                        report the error;
                        break;
                }
                process the packet;
        }

If you're not doing your own main loop in the fashion I described, there's no 
reason to use pcap_dispatch().  If you are, you would either use it or put the 
pcap_t into non-blocking mode and write your own loop using pcap_next_ex(), 
processing packets until you get an error or a "no packets available right now" 
indication, and then going back to the main loop to wait for an event.

Whether to use pcap_loop() or pcap_next_ex(), in the case where you don't have 
your own main loop, depends on whether a callback or a loop of your own is more 
convenient, and whether the extra overhead of pcap_next_ex() actually makes a 
difference.
_______________________________________________
Winpcap-users mailing list
[email protected]
https://www.winpcap.org/mailman/listinfo/winpcap-users

Reply via email to