pcap 1.6 man手册

pcap 1.6主要的函数说明指南,自己翻译了一下,贴出来共享: 打开一个可以进行读取的设备 打开设备 live capture 使用pcap_create()创建设备,并且使用pcap_activate()激活。 得到设备的list,使用pcap_findalldevs(),释放的到的list,使用pcap_findalldevs() pcap_lookupdev() 得到第一个不是loopback的设备 从文件中获得 打开一个已经保存好的文件,使用pcap_open_offline()直接输入路径,pcap_fopen_offline()输入的是FILE *类型 得到一个FILE *类型,使用pcap_file()函数 fake pcap_t 作为 pcap_open_dead() 生成一个无用句柄,仅作为写入文件和编译过滤表达式 上述函数返回一个指向pcap_t类型的指针作为抓包的句柄,要关闭这个句柄,使用pcap_close() 句柄参数设置 snapshot length 抓取数据包长度。默认抓取的是整个数据包,这将花费更多的CPU时间、磁盘空间将数据包拷贝到程序中。如果只需要部分的数据包长度,那可以设置这个数值为需要的数据包长度即可。 如果这个长度设置和snaplen相同,并且snaplen小于抓取的数据包的长度,那么第一个和snaplen长度相同的数据包将会被捕获。 65535是最大值 使用pcap_set_snaplen()来设置 premiscuous mode 混杂模式,不用多说 使用pcap_set_promisc()设置 monitor mode IEEE 802.11 wireless协议下,即时打开混杂模式也收不到别人的包。monitor model 又叫 rfmon mode(radio frequency monitor)。在这个模式下,网卡会提供802.11包头,也有可能会提供有关这个帧的伪包头。在这个模式下,网卡可能会和原有网络断开,所以这时候网卡使用不了任何无线网络。 设置monitor mode使用pcap_set_rfmon()函数,检测是否能设置这个模式,使用pcap_can_set_rfmon() read timeout 通常而言,数据包一旦到达,抓包程序就会被唤醒。这样每抓一次包,就会产生一个或多个系统调用。 但是,我们可以指定当数据包到达时,中间有一个短的延迟再进行抓包和包处理。这样在这个数据包被抓包程序捕获时,会累计了不止一个包。那么,一次程序的唤醒就能处理多个包,那么一系列的系统调用就能处理多个数据包,而不是一个包。这样极大的减少了CPU占用率。 这个数值是必须设置的,这样程序就不用等待操作系统抓包缓冲区填满了再给抓包程序,如果数据包到达的比较慢,那将会等待很长一段时间。 并不是所有的操作系统都支持这个数值,在不支持的操作系统上,这个时间是被忽略的。这个timeout设置为0,那么将会导致读取包函数无延迟的等待足够多的数据包到达。 NOTICE:read timeout值不能被用于读取一个包并在指定的一段时间内返回,因为在某些平台上,timeout并不是被支持的,在其他平台上,直到第一个包到达时,定时器才会开始计时。这就意味着read timeout是无效的,例如,在一个程序要允许包抓取的loop去周期的poll用户输入,那么这并不保证在如果没有数据包到达的情况下,即时timeout过期了,读取数据包的函数调用会返回。(PS:-1表示无延迟) 使用pcap_set_timeout()来设置read timeout buffer size 缓存buffer大小,如果buffer满了,多余部分就要丢掉,除非你的操作系统是非页式存储的操作系统(non-pageable operating system memory)。使用pcap_set_buffer_size()设置 timestamp type 时间戳格式,目前用不到 使用pcap_datalink()函数来决定数据链路层的类型,以此来确定包头的格式。返回值在http://www.tcpdump.org/linktypes.html 不要假定从一个给定的抓取或者文件中获得的数据包会有任何给定的数据链路层头。举个栗子,Linux上的’any’类型的设备在数据链路层上使用DLT_LINUX_SLL 就算在这个系统上的所有设备在这个’any’设备被打开的时候,仍然是其他数据类型,如DLT_EN10MB (以太网)。 选择一个数据链路层头来进行living capture 有一些设备不止支持一种数据类型,为了得到网卡支持的链路层头部,使用pcap_list_datalinks()在一个已经激活的pcap_t上获得数据类型。释放链表使用pcap_free_datalinks()。设置抓取的数据包头部pcap_set_datalink()。这个操作应该在设备已经激活之后,和在设备没有激活而且没有任何过滤器被编译安装之前。...

2015-05-13 · qhsong