为什么我的程序报告的捕获数据包比Wireshark多?

时间:2015-08-19 23:52:19

标签: wireshark packet-capture

我正在使用pcap和visual studio编写数据包嗅探器。我已经为offline capturing获取了示例代码,并将其与寻找接口并实时捕获数据包的代码相结合。这是我必须显示从1获得的数据包信息。

? :

我遇到的问题是,如果我运行WireShark实时捕获并运行我的程序,两者都会捕获数据包,但WireShark将显示它捕获数据包20和VS将显示packetCount = 200.(注意:选择显示Wireshark的任意数字都没有捕获到很多数据包,但VS的计数非常快。)

根据我的理解,似乎while循环的运行速度比数据包进入的速度快得多,所以它只是从一次又一次收到的最后一个数据包中打印信息,直到新的数据包进入。 我怎样才能让VS只在进入时捕获数据包?

2 个答案:

答案 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并且超时到期&#34 ;; 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");
    }
}

答案 1 :(得分:0)

解决方案:显然,在参数周围添加括号可以解决问题。

  

while((( int returnValue = pcap_next_ex(pcap,& header,& data)> = 0