【发布时间】:2020-08-21 08:21:07
【问题描述】:
我正在使用 libpcap 库在 C 中编写数据包解析器。这是简单的代码
int main(int argc, char *argv[])
{
pcap_t *pcap;
const unsigned char *packet;
char errbuf[PCAP_ERRBUF_SIZE];
struct pcap_pkthdr header;
clock_t begin = clock();
// Type your interface name here
char *device = "ens33";
char error_buffer[PCAP_ERRBUF_SIZE];
pcap_t *handle;
int timeout_limit = 10000; // milliseconds
if (device == NULL)
{
printf("Error finding device: %s\n", error_buffer);
return 1;
}
// For live packet capturing
handle = pcap_open_live(
device,
BUFSIZ,
0,
timeout_limit,
error_buffer);
if (handle == NULL)
{
printf("Error getting handle%s\n", error_buffer);
return 2;
}
pcap_loop(handle, 0, dump_UDP_packet, NULL);
clock_t end = clock();
double time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
printf("Program completed: total packets processed: %d (non UDP/Radius packets: %d) in %f seconds\n", count, non_packets, time_spent);
return 0;
}
我正在使用 tcpreplay 播放来自 pcap 文件的实时流量。然而,我的程序只能从 240,000 个数据包的文件中处理/读取大约 80,000 个数据包。当我尝试从 tcpdump 读取相同的数据包时,我没有丢包。
这是由于缓冲区大小造成的吗?如何确保数据包不丢失?
高速 (~500MB/秒) tcpreplay 大约需要 1.5 到 2 秒
我在 Ubuntu 18.04(32 GB RAM,24 核处理器)上运行它
【问题讨论】:
-
贴出的代码无法编译!除其他问题外,它缺少所需头文件的
#include语句,您是否希望使用猜测您实际使用的头文件? -
编译时,始终启用警告,然后修复这些警告。 (对于
gcc,至少使用:-Wall -Wextra -Wconversion -pedantic -std=gnu11)注意:其他编译器使用不同的选项来产生相同的结果 -
关于;
int main(int argc, char *argv[])这会导致编译器输出 2 条关于未使用参数的警告消息。建议使用main()int main( void )的其他有效签名 -
关于:
const unsigned char *packet;当指针不指向任何东西时,它怎么可能是const? -
关于;
if (device == NULL)这永远不会是真的,因为:char *device = "ens33";
标签: c tcpdump libpcap packet-capture tcpreplay