Articles of libpcap

为什么一些像nginx和pcap这样的开源项目使用自己的'nginx_uint_t'和'bpf_u_int32'而不是内置的types'unsigned int'

我正在处理libpcap和nginx源代码。 我想知道这样的事情: 在libpcap中,他们使用自己的unsigned inttypesbpf_u_int32 在nginx中,它们也使用自己的unsinged inttypesngx_int_t 与内置types相比,这些用法的优点是什么?

如何在没有pcap_breakloop的情况下打破pcap_loop的循环

我有libpcap版本0.6和linux内核版本2.6.18,在这个版本中,我无法升级0.8版本中的这些和pcap_breakloop()函数。 我的问题是如何不使用pcap_breakloop()打破pcap_loop() pcap_breakloop() ? 任何帮助将不胜感激。

pcap_inject在断开的接口上

我试图使用libpcap实现存储在.pcap文件中的重放数据包。 这个过程非常简单:我将打开pcap_open_offline的pcap文件,然后将数据包传递给使用pcap_open_live打开的设备,并通过接口将它们与pcap_inject一起发送。 现在网卡没有连接以太网电缆。 我知道pcap_open_live不会告诉打开的设备是否支持发送,所以我从pcap_inject( errno 100 )得到错误。 这是预期的吗? 如果我只是从cmd行使用tcpreplay,它会完成并且不会显示错误,无论是否插入以太网电缆。 任何人都知道如何tcpreplay / tcpedit处理“死”的接口? tcpreplay重写包头,而我试图发送他们的原始? 任何帮助表示赞赏! 我在Ubuntu 14.04和接口是无地址和promisc模式: auto eth1 iface eth1 inet manual up ifconfig eth1 promisc up down ifconfig eth1 promisc down

如何使用libpcap实现tcpdump -i接口arp

我想实现命令tcpdump -i eth0 arp来观察我的ubuntu上eth0接口上的arp数据包。 我使用libpcap,但函数pcap_next_ex的返回值始终为0.使用tcpdump -i eth0 arp同时可以观察到arp数据包。 /* * compile(root): gcc test.c -lpcap * run : ./a.out * output : time out * time out * time out * … */ #include <pcap.h> #include <stdlib.h> #include <string.h> #include <stdio.h> #define ARP_REQUEST 1 #define ARP_REPLY 2 typedef struct arp_hdr_s arp_hdr_t; struct arp_hdr_s { u_int16_t htype; […]

是否有可能从缓冲区parsingpcap数据包

我有一大堆用lzma压缩的pcap文件(> 10GB)。 我需要在我的机器上parsing它们,而我没有足够的空间来先解压它们。 有很多libs可以从文件streamlzma。 问题是libpcap方面,我已经读了几次API,并找不到parsing缓冲区的任何方法。 我在libs的源代码中看到,它首先用fread 读取魔术字节和文件头 : amt_read = fread((char *)&magic, 1, sizeof(magic), fp); … amt_read = fread(((char *)&hdr) + sizeof hdr.magic, 1, sizeof(hdr) – sizeof(hdr.magic), fp); 然后pcap_next_packet也使用fread 从文件中读取下一个数据包 。 所以看起来很难从lzmastream向它传递一个缓冲区。 另一方面,这些函数作为指针存储在pcap_t结构中 。 所以我可以实现我自己的程序,但是,这样我将不得不从libpcap复制大量的代码。 有没有人知道如何做到这一点没有黑客进入libpcap? 我在libpcap API中丢失了什么? 更新:与@马丁和其他人的帮助下,我设法使其工作。 我将发布实现,所以寻找方法的人可以使用它。 if (check_file_exists("/path/to/file.pcap.xz")) { return; } // first open a pipe FILE *pipe = popen("xz -d […]

如何使用原始套接字只收听想要的stream量?

三个相关的问题: 原始套接字是否有任何相当于内核BPF(由libpcap使用)的过滤方法? 打开原始套接字是否意味着它接收到机器上的每个 IP数据包? iptables如何与原始套接字进行交互 – 原始套接字是否看到iptables丢弃的数据包? BPF – http://lwn.net/Articles/599755/

基于libpcap的嗅探器是否可以用于基于拨号的Internet连接

我正在写一个使用libpcap的http-sniffer。 我不知道它会工作,如果用户使用基于拨号的互联网连接

我如何使libpcap / pcap_loop非阻塞?

我目前正在使用libpcap在混杂模式下嗅探stream量 int main() { // some stuff printf("Opening device: %s\n", devname.c_str()); handle = pcap_open_live(devname.c_str(), 65536 , 1 , 0 , errbuf); if (handle == NULL) { fprintf(stderr, "Couldn't open device %s : %s…" , devname.c_str(), errbuf); return 1; } printf(" Done\n"); pcap_loop(handle , -1 , process_packet , NULL); // here run a thread to do […]

智能的方法来快速比较IP地址?

我有一个IP地址列表,存储如下: char IP_addresses_list[] = { "157.55.130", /* 157.55.130.0/24 */ "157.56.52", /* 157.56.52.0/24 */ "157.12.53", /* 157.12.53.0/24 */ … }; 我从嗅探的数据包中获取IP地址(将其转换为struct iphdr *iph = (struct iphdr *)(packet + sizeof(struct ether_header));我使用inet_ntop将其转换为string;最后,比较IP地址从列表中的数据包与下面的代码: /* * input: IP address to search in the list * output: 1 if IP address is found in the list, 0 otherwise */ int find_IP_addr(char […]

零拷贝机制和libpcap

是否有可能使用零拷贝数据包机制在Linux上使用libpcap读取数据包? (我正在使用CentOS 6.2)如果是,我可以看到任何代码的例子吗?