阅读背景:

winpcap每秒获取数据包数和speed

来源:互联网 
#include <QCoreApplication> //int main(int argc, char *argv[]) //{ // QCoreApplication a(argc, argv); // return a.exec(); //} #include "pcap.h" #include<remote-ext.h> //#include<Pdh.h> #pragma comment(lib , "Iphlpapi.lib") #define TRACE(s) OutputDebugString(TEXT(s)); main() { pcap_if_t *alldevs; pcap_if_t *d; int inum; int i=0; pcap_t *adhandle; int res; char errbuf[PCAP_ERRBUF_SIZE]; struct tm *ltime; char timestr[16]; struct pcap_pkthdr *header; const u_char *pkt_data; time_t local_tv_sec; /* 获取本机设备列表 */ if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -1) { fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf); exit(1); } /* 打印列表 */ for(d=alldevs; d; d=d->next) { printf("%d. %s", ++i, d->name); if (d->description) printf(" (%s)\n", d->description); else printf(" (No description available)\n"); } if(i==0) { printf("\nNo interfaces found! Make sure WinPcap is installed.\n"); return -1; } printf("Enter the interface number (1-%d):",i); scanf("%d", &inum); if(inum < 1 || inum > i) { printf("\nInterface number out of range.\n"); /* 释放设备列表 */ pcap_freealldevs(alldevs); return -1; } /* 跳转到已选中的适配器 */ for(d=alldevs, i=0; i< inum-1 ;d=d->next, i++); /* 打开设备 */ if ( (adhandle= pcap_open(d->name, // 设备名 65536, // 要捕捉的数据包的部分 // 65535保证能捕获到不同数据链路层上的每个数据包的全部内容 PCAP_OPENFLAG_PROMISCUOUS, // 混杂模式 1000, // 读取超时时间 NULL, // 远程机器验证 errbuf // 错误缓冲池 ) ) == NULL) { fprintf(stderr,"\nUnable to open the adapter. %s is not supported by WinPcap\n", d->name); /* 释放设列表 */ pcap_freealldevs(alldevs); return -1; } printf("\nlistening on %s...\n", d->description); /* 释放设备列表 */ pcap_freealldevs(alldevs); /* 获取数据包 */ while((res = pcap_next_ex( adhandle, &header, &pkt_data)) >= 0){ if(res == 0){ /* 超时时间到 */ TRACE("Read Packet TimeOut!!"); continue; } static double m_Packet_Count = 0; static DWORD m_PacketsLen = 0; //包的长度 static DWORD m_TickCount = 0; static double m_Speed = 0.0; m_PacketsLen+=header->len;//接受包的总长度 m_Packet_Count ++; if(GetTickCount() - m_TickCount > 1000)//每秒读取计算一次。GetTickCount()返回的是毫秒数 { m_Speed = m_PacketsLen/1000.0;//speed .单位kbps m_TickCount = GetTickCount();//返回从启动到当前经过的毫秒数 m_PacketsLen = 0; printf("Packets:%.0f/s Speed:%.3f Kbps\r",m_Packet_Count,m_Speed); m_Packet_Count = 0; } } if(res == -1){ printf("Error reading the packets: %s\n", pcap_geterr(adhandle)); return -1; } return 0; } #------------------------------------------------- # # Project created by QtCreator 2018-10-13T11:36:29 # #------------------------------------------------- QT += core QT -= gui TARGET = winpcap_net CONFIG += console CONFIG -= app_bundle TEMPLATE = app INCLUDEPATH += D:/WpdPack/Include LIBS += D:/WpdPack/Lib/wpcap.lib win32{LIBS+=-lws2_32} SOURCES += main.cpp #include <QCoreApplication> //int main(int argc,



你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: