我正在使用pcap和visual studio编写数据包嗅探器。我已经为offline capturing获取了示例代码,并将其与寻找接口并实时捕获数据包的代码相结合。这是我必须显示从1获得的数据包信息。
? :
我遇到的问题是,如果我运行WireShark实时捕获并运行我的程序,两者都会捕获数据包,但WireShark将显示它捕获数据包20和VS将显示packetCount = 200.(注意:选择显示Wireshark的任意数字都没有捕获到很多数据包,但VS的计数非常快。)
根据我的理解,似乎while循环的运行速度比数据包进入的速度快得多,所以它只是从一次又一次收到的最后一个数据包中打印信息,直到新的数据包进入。 我怎样才能让VS只在进入时捕获数据包?
答案 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 ))