Я пишу пакетный снифер, используя pcap и визуальную студию. Я взял пример кода для offline capturing и объединил его с кодом, который ищет интерфейс и захватывает пакеты в реальном времени. Это то, что я должен отобразить информацию о пакетах, полученную от 1.Почему моя программа сообщает больше захваченных пакетов, чем Wireshark?
while (int returnValue = pcap_next_ex(pcap, &header, &data) >= 0)
{
// Print using printf. See printf reference:
// http://www.cplusplus.com/reference/clibrary/cstdio/printf/
// Show the packet number
printf("Packet # %i\n", ++packetCount);
// Show the size in bytes of the packet
printf("Packet size: %d bytes\n", header->len);
// Show a warning if the length captured is different
if (header->len != header->caplen)
printf("Warning! Capture size different than packet size: %ld bytes\n", header->len);
// Show Epoch Time
printf("Epoch Time: %d:%d seconds\n", header->ts.tv_sec, header->ts.tv_usec);
// loop through the packet and print it as hexidecimal representations of octets
// We also have a function that does this similarly below: PrintData()
for (u_int i=0; (i < header->caplen) ; i++)
{
// Start printing on the next after every 16 octets
if ((i % 16) == 0) printf("\n");
// Print each octet as hex (x), make sure there is always two characters (.2).
printf("%.2x ", data[i]);
}
// Add two lines between packets
printf("\n\n");
}
Проблема у меня в том, что если я бегу живого захвата Wireshark, а также запустить мою программу, оба пакета захвата жить, но WireShark покажет, что это захват пакетов 20 и VS покажет packetCount = 200. (Примечание: произвольные числа, выбранные для отображения Wireshark, не захватили много пакетов, но VS считается очень быстрым.)
Из того, что я понимаю, кажется, цикл while работает намного быстрее, чем поступают пакеты поэтому он просто печатает информацию из последнего полученного ею пакета снова и снова, пока не появится новый. Как я могу заставить VS только захватить пакеты по мере их поступления?
Спасибо за разъяснение на мой вопрос. То, что вы написали, имеет смысл и кажется, что оно должно работать, но я добавил оператор if, и по-прежнему получаю очень высокий пакетный подсчет по сравнению с захватом wirehark. – mchoy25
@Guy_Harris Итак, в скобках есть разница, несмотря на то, что есть только один аргумент. Должен выглядеть так: ((int returnValue = pcap_next_ex (pcap, & header, & data))> = 0) ' – mchoy25