2015-08-19 2 views
0

Я пишу пакетный снифер, используя 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 только захватить пакеты по мере их поступления?

ответ

0

РЕШЕНИЕ: Таким образом, очевидно, добавляя скобки вокруг аргумента устраняет проблему ,

в то время как ((( INT ReturnValue = pcap_next_ex (PCAP, & заголовок, & данные) )> = 0 ))

1

Я не знал, что Visual Studio включила пакетный сниффер; вы имели в виду «как я могу получить мое приложение, которое я создаю с помощью Visual Studio, чтобы захватывать пакеты только по мере их поступления?»

Если это то, что вы имели в виду, то это то, что делает ваш код.

К сожалению, что это такое не Выполнение является «проверкой, действительно ли пакет действительно пришел».

Процитирую страницу человека для pcap_next_ex() (да, UN * X, но это относится к Windows, и WinPcap а):

pcap_next_ex() returns 1 if the packet was read without problems, 
    0 if packets are being read from a live capture, and the timeout 
    expired, -1 if an error occurred while reading the packet, and -2 
    if packets are being read from a ``savefile'', and there are no 
    more packets to read from the savefile. If -1 is returned, 
    pcap_geterr() or pcap_perror() may be called with p as an argument 
    to fetch or display the error text. 

Акцент на «0, если пакеты считываются из живой захват и истечение времени ожидания »; 0 означает, что вы сделали не получить пакет.

ли не действовать, как будто пакет были захвачены в плен, если pcap_next_ex() возвращается 0, только сделать это, если он вернулся 1:

while (int returnValue = pcap_next_ex(pcap, &header, &data) >= 0) 
{ 
    if (returnValue == 1) { 
     // Print using printf. See printf reference: 
     // http://www.cplusplus.com/reference/clibrary/cstdio/printf/ 

     // Show the packet number 
     printf("Packet # %i\n", ++packetCount); 

      ... 

     // Add two lines between packets 
     printf("\n\n"); 
    } 
} 
+0

Спасибо за разъяснение на мой вопрос. То, что вы написали, имеет смысл и кажется, что оно должно работать, но я добавил оператор if, и по-прежнему получаю очень высокий пакетный подсчет по сравнению с захватом wirehark. – mchoy25

+0

@Guy_Harris Итак, в скобках есть разница, несмотря на то, что есть только один аргумент. Должен выглядеть так: ((int returnValue = pcap_next_ex (pcap, & header, & data))> = 0) ' – mchoy25