#c #pcap
#c #pcap
Вопрос:
Я запускаю следующий код на C для чтения пакетов внутри файла PCap:
#include <iostream>
#include <pcap.h>
using namespace std;
int main()
{
int num, inum,i = 0;
pcap_if_t *alldevs;
pcap_t *adhandle;
struct bpf_program fcode;
bpf_u_int32 net, mask;
char *dev;
string file = "C:\Users\AwesomeUser\Desktop\dataset.pcap";
char errbuff[PCAP_ERRBUF_SIZE];
pcap_t * pcap = pcap_open_offline(file.c_str(), errbuff);
struct pcap_pkthdr *header;
const u_char *data = NULL;
dev = pcap_lookupdev(errbuff);
if (pcap_lookupnet( dev, amp;net, amp;mask, errbuff ) == -1)
{
fprintf(stderr, "Can't get netmask for device %sn", dev);
net = 0;
mask = 0;
}
u_int packetCount = 0;
cout << "Pre-loop test";
while( int returnValue = pcap_next_ex( pcap , amp;header, amp;data) >= 0)
{
cout << "inner loop test";
if (pcap_compile(pcap , amp;fcode, "ip and tcp", 1, net) < 0)
{
fprintf( stderr, "nC is unable to compile the packet filter. Please check the syntaxn");
pcap_freealldevs(alldevs);
return -1;
}
if ( pcap_setfilter( pcap, amp;fcode) < 0)
{
fprintf(stderr, "nThere is an error in setting the filter.n");
pcap_freealldevs(alldevs);
return -1;
}
printf("Packet number %in", packetCount);
printf("Packet size: %d bytesn", header->len);
if ( header->len != header->caplen)
printf("Warning! Packet size different from capture size: %ld bytesn", header->len);
printf("Epoch time: %d:%d secondsnnn", header->ts.tv_sec, header->ts.tv_usec);
}
cout << packetCount;
cin >> num;
return 0;
}
Программа завершает работу со следующим выводом:
Pre-loop test
Я определил, что сбой происходит при выполнении условия цикла while в самый первый раз:
pcap_next_ex( pcap , amp;header, amp;data)
Насколько я знаю, pcap_next_ex должен прочитать следующий пакет. Я протестировал этот точный код с другими файлами .pcap, и он безупречно работает со всем, что я пробовал из Интернета, и с файлами, которые я создаю сам, используя Wireshark. Единственное различие, о котором я знаю, заключается в том, что файл dataset.pcap, который я пытаюсь прочитать в этом коде, очень большой (8 ГБ). Есть ли что-то особенное, что мне нужно сделать, чтобы прочитать такой большой файл? Что еще может быть причиной сбоя?
Комментарии:
1. вы уверены в приоритете оператора в
int returnValue = pcap_next_ex( pcap , amp;header, amp;data) >= 0
результате значимого условия? (Я не)2. @tobi303 Я попробовал
while( pcap_next_ex( pcap , amp;header, amp;data) >= 0)
, что дало тот же эффект во всех случаях