The phpcap extension is a wrapper over libpcap for PHP.
Usage example:
/* Find possible devices and their associated addresses, if any */ var_dump(phpcap_findalldevs()); /* array(4) { ["eth0"]=> array(3) { [0]=> string(7) "2.0.0.0" [1]=> string(14) "192.168.35.171" [2]=> string(7) "0.0.0.0" } ["wlan0"]=> array(2) { [0]=> string(7) "3.0.0.0" [1]=> string(7) "0.0.0.0" } ["any"]=> array(0) { } ["lo"]=> array(3) { [0]=> string(7) "1.0.0.0" [1]=> string(9) "127.0.0.1" [2]=> string(7) "0.0.0.0" } } */ /* Create a resource with a device, you should need root access */ $r = phpcap_create('eth0'); /* Or create a resource in promiscuous mode */ $r = phpcap_create('eth0', PHPCAP_DEV_PROMISC); /* If your device is wireless, you could use RFMON mode as well */ $r = phpcap_create('wlan0', PHPCAP_DEV_PROMISC | PHPCAP_DEV_RFMON); /* You can set a filter for certain packets Filter will be set for every future dispatch() call Filter syntax is pcap syntax, have a look at tcpdump man page for more info */ phpcap_setfilter($r, 'port 80'); // only capture packets on port 80 /* Use pcap_dispatch((resource) $pcap, (callback) $function, (int) $num_of_packet) to call a callback on each captured packet. */ phpcap_dispatch($r, function($rawpacket, $capture) { }); /* Use the last parameter to limit the number of packets to capture. The phpcap_dispatch() returns TRUE on success, FALSE otherwise */ phpcap_dispatch($r, function($rawpacket, $capture) { }, 150); /* The callback is passed the raw packet as first argument, you can play with raw data : */ phpcap_dispatch($r, function($rawpacket) { var_dump( unpack('H12macdest/H12macsrc/H4ethtype/H24/a4ipsrc/a4ipdest',$rawpacket) }); /* Better use the second parameter which provides parsed data : */ phpcap_dispatch($r, function($rawpacket, $capture) { var_dump($capture) }); /* array(4) { ["ether_type"]=> string(5) "Ox806" ["source_host"]=> string(11) "0:9:f:9:0:5" ["destination_host"]=> string(16) "ff:ff:ff:ff:ff:ff" } */ /* If the packet is of type IP (0x800), then more info are available : */ phpcap_dispatch($r, function($rawpacket, $capture) { var_dump($capture) }); /* array(4) { ["ether_type"]=> string(5) "Ox800" ["source_host"]=> string(11) "0:9:f:9:0:5" ["destination_host"]=> string(16) "b4:99:ba:56:7e:0" ["destination_ip"]=> string(12) "109.13.10.68" ["source_ip"]=> string(13) "101.46.99.111" } */ /* You can reset a filter you previously set */ phpcap_resetfilter($r); /* If you want to exit the callback, use phpcap_dispatch_break((resource) $pcap); */ phpcap_dispatch($r, function($packet, $cap) use ($r) { var_dump($cap); if(/*something*/) { phpcap_dispatch_break($r); }}); /* Time to get some stats : */ var_dump(phpcap_stats($r)); /* array(2) { ["received_packets"]=> int(48) ["dropped_packets"]=> int(3) } */ /* Finally, you may clean the resource with : */ phpcap_close($r);Few notes :
- libpcap needed, actually only Linux is supported, may compile on BSD, PR are welcome
- Don't expect this to work on Windows platform, thanks for not asking for support :-)
- You may need to be root to capture device traffic
- You should refer to http://www.tcpdump.org/pcap3_man.html
- For an overview of filter-options refer to http://wiki.wireshark.org/CaptureFilters
Code is highly under development.