/******这个cpp的函数都是网络流量有关的,以后client和server的流量是分开做的*****/
/*
6.1、6.2、6.3、8.1、8.2、8.3取总流量是根据网卡的信息来取的,就和我们在本地连接状态里看到的一样
这个是client版的,通过链表解析包计算范围端口的总流量
*/
//根据条件取得客户端的端口总流量
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <Winsock2.h>
#include <malloc.h>
#include "mstcpip.h"
#include <iostream.h>
#include "netuse.h"
#include "commonlib.h"
#include <tchar.h>
#include <Windows.h>
#include <Iphlpapi.h>
#pragma comment(lib,"iphlpapi.lib")
#include <assert.h>
#include <string>
#include <vector>
int anum = 0;//anum是用来记录网卡数量的
double totalallflux = 0,totalinflux = 0,totaloutflux = 0;
//double allflux[5],influx[5],outflux[5];//弄5个int数组的意思是默认最多5个网卡
//int allflux[5],influx[5],outflux[5];//弄5个int数组的意思是默认最多5个网卡
char ip1[17] = "0.0.0.0";//ip1,1p2是打算用来存放多网卡的ip
char ip2[17] = "0.0.0.0";
//allflux[0] = 0,allflux[1] = 0,influx[0] = 0,influx[1] = 0,outflux[0] = 0,outflux[1] = 0;
//int allflux1,allflux2,influx1,influx2,outflux1,outflux2;
int fluxflag1=0,fluxflag2=0;
LONGLONG Ttime1=0;
int network();
int getnumofadapter();//计算网卡数量的函数
//函数定义
DWORD WINAPI GetClientFlux(LPVOID lp)//通过网卡取client流量线程函数
{
network();
return 0;
}
int getnumofadapter()
{
DWORD dwIndex;
//DWORD dwNumber;
DWORD dwResult;
ULONG OutBufLen;
char buf[2000];
IP_ADAPTER_INFO AdapterInfo;
IP_ADAPTER_INFO * prt;
//PIP_ADDR_STRING pAddrString;
PIP_ADAPTER_INFO pAdapterNext;
MIB_IFROW IfRow;
OutBufLen = sizeof(IP_ADAPTER_INFO);
dwResult = GetAdaptersInfo((struct _IP_ADAPTER_INFO *)buf,&OutBufLen);
//第一个参数是用来保存网卡信息的内存缓冲的首地址,第二个参数是这个缓冲的大小
prt = (struct _IP_ADAPTER_INFO *)buf;
AdapterInfo = *prt;
if(dwResult == ERROR_BUFFER_OVERFLOW)
{
GetAdaptersInfo(&AdapterInfo,&OutBufLen);
}
else if (dwResult != ERROR_SUCCESS)
{
//printf("GetAdaptersInfo Error: %d\n",GetLastError());
printf("网卡没连接\n");
Sleep(10000);
network();
}
pAdapterNext = &AdapterInfo;
while(pAdapterNext != NULL)
{
dwIndex = pAdapterNext->Index;//网卡索引号
/*for(dwNumber = 0;dwNumber < pAdapterNext->AddressLength - 1; dwNumber++)
{
printf("%.2X-",pAdapterNext->Address[dwNumber]);
}
printf("%.2X\n",pAdapterNext->Address[dwNumber]);
pAddrString = &pAdapterNext->IpAddressList;
while(pAddrString != NULL)
{
//printf("\t\t %-15s\t",pAddrString->IpAddress.String);
//printf("%s\n",pAddrString->IpMask.String);
strcpy(ip1,pAddrString->IpAddress.String);
pAddrString = pAddrString->Next;
}*/
IfRow.dwIndex = dwIndex;
if((dwResult = GetIfEntry(&IfRow)) != NO_ERROR)
/*GetIfEntry:返回指定接口的信息。pIfRow:[输入,输出] 成功返回一个指向本机接口
信息的MIB_IFROW类型;输出,需设置MIB_IFROW的dwIndex 为想要获取信息的接口的序号。
返回值:成功,返回0;失败,返回错误代码。*/
{
//printf("GetIfEntry Error: %d\n",dwResult);
break;
}
anum = anum + 1;
pAdapterNext = pAdapterNext->Next;
}
return 0;
}
int network()
{
DWORD dwIndex;
DWORD dwNumber;
DWORD dwResult;
ULONG OutBufLen;
char buf[2000];
memset(buf,0,2000);
IP_ADAPTER_INFO AdapterInfo;
IP_ADAPTER_INFO * prt;
PIP_ADDR_STRING pAddrString;
PIP_ADAPTER_INFO pAdapterNext;
MIB_IFROW IfRow;
OutBufLen = sizeof(IP_ADAPTER_INFO);
SYSTEMTIME sys;
double allflux[5],influx[5],outflux[5];//弄5个int数组的意思是默认最多5个网卡
double allflux1[5],allflux2[5];
//allflux1[0] = 0,allflux1[1] = 0,allflux2[0] = 0,allflux2[1] = 0;
allflux1[0] = 0,allflux2[0] = 0;
allflux1[1] = 0,allflux2[1] = 0;
allflux1[2] = 0,allflux2[2] = 0;
allflux1[3] = 0,allflux2[3] = 0;
allflux1[4] = 0,allflux2[4] = 0;
DWORD allt1[5],allt2[5];
//allt1[0] = 0,allt1[1] = 0,allt2[0] = 0,allt2[1] = 0;
allt1[0] = 0,allt2[0] = 0;
allt1[1] = 0,allt2[1] = 0;
allt1[2] = 0,allt2[2] = 0;
allt1[3] = 0,allt2[3] = 0;
allt1[4] = 0,allt2[4] = 0;
double influx1[5],influx2[5];
//influx1[0] = 0,influx1[1] = 0,influx2[0] = 0,influx2[1] = 0;
influx1[0] = 0,influx2[0] = 0;
influx1[1] = 0,influx2[1] = 0;
influx1[2] = 0,influx2[2] = 0;
influx1[3] = 0,influx2[3] = 0;
influx1[4] = 0,influx2[4] = 0;
DWORD int1[5],int2[5];
//int1[0] = 0,int1[1] = 0,int2[0] = 0,int2[1] = 0;
int1[0] = 0,int2[0] = 0;
int1[1] = 0,int2[1] = 0;
int1[2] = 0,int2[2] = 0;
int1[3] = 0,int2[3] = 0;
int1[4] = 0,int2[4] = 0;
double outflux1[5],outflux2[5];
//outflux1[0] = 0,outflux1[1] = 0,outflux2[0] = 0,outflux2[1] = 0;
outflux1[0] = 0,outflux2[0] = 0;
outflux1[1] = 0,outflux2[1] = 0;
outflux1[2] = 0,outflux2[2] = 0;
outflux1[3] = 0,outflux2[3] = 0;
outflux1[4] = 0,outflux2[4] = 0;
DWORD outt1[5],outt2[5];
//outt1[0] = 0,outt1[1] = 0,outt2[0] = 0,outt2[1] = 0;
outt1[0] = 0,outt2[0] = 0;
outt1[1] = 0,outt2[1] = 0;
outt1[2] = 0,outt2[2] = 0;
outt1[3] = 0,outt2[3] = 0;
outt1[4] = 0,outt2[4] = 0;
/***************
*测试双网卡流量*
****************/
DWORD dmaf[2];
DWORD dmif[2];
DWORD dmof[2];
int dpos = 0;
getnumofadapter();
printf("这台机子上有%d块网卡\n",anum);
while(true)
{
if(fluxflag1==0)
{
fluxflag2 = 0;
totalallflux = 0,totalinflux = 0,totaloutflux = 0;
dwResult = GetAdaptersInfo((struct _IP_ADAPTER_INFO *)buf,&OutBufLen);
//第一个参数是用来保存网卡信息的内存缓冲的首地址,第二个参数是这个缓冲的大小
prt = (struct _IP_ADAPTER_INFO *)buf;
AdapterInfo = *prt;
if(dwResult == ERROR_BUFFER_OVERFLOW)
{
GetAdaptersInfo(&AdapterInfo,&OutBufLen);
}
else if (dwResult != ERROR_SUCCESS)
{
printf("GetAdaptersInfo Error: %d\n",GetLastError());
printf("网卡没连接\n");
dpos = 0;
Sleep(10000);
continue;
}
pAdapterNext = &AdapterInfo;
while(pAdapterNext != NULL)
{
dwIndex = pAdapterNext->Index;//网卡索引号
for(dwNumber = 0;dwNumber < pAdapterNext->AddressLength - 1; dwNumber++)
{
//printf("%.2X-",pAdapterNext->Address[dwNumber]);
}
//printf("%.2X\n",pAdapterNext->Address[dwNumber]);
pAddrString = &pAdapterNext->IpAddressList;
/*while(pAddrString != NULL)
{
//printf("\t\t %-15s\t",pAddrString->IpAddress.String);
//printf("%s\n",pAddrString->IpMask.String);
strcpy(ip1,pAddrString->IpAddress.String);
printf("成功啦%s\n",ip1);
pAddrString = pAddrString->Next;
}*/
IfRow.dwIndex = dwIndex;
if((dwResult = GetIfEntry(&IfRow)) != NO_ERROR)
/*GetIfEntry:返回指定接口的信息。pIfRow:[输入,输出] 成功返回一个指向本机接口
信息的MIB_IFROW类型;输出,需设置MIB_IFROW的dwIndex 为想要获取信息的接口的序号。
返回值:成功,返回0;失败,返回错误代码。*/
{
//printf("GetIfEntry Error: %d\n",dwResult);
break;
}
allflux2[dpos] = IfRow.dwOutOctets + IfRow.dwInOctets;
if(allflux2[dpos] < allflux1[dpos])
{
allflux1[dpos] = allflux2[dpos];
influx2[dpos] = IfRow.dwInOctets;
influx1[dpos] = influx2[dpos];
outflux2[dpos] = IfRow.dwOutOctets;
outflux1[dpos] = outflux2[dpos];
continue;//如果发现后面一次的总数据包大小比前一次小,继续下次循环。
}
//printf("第%d块网卡累计总流量%d\n",dpos % anum,allflux2[dpos]);
dmaf[dpos] = IfRow.dwOutOctets + IfRow.dwInOctets;
//printf("第%d块网卡总数据包%d\n",dpos % anum,dmaf[dpos]);
GetLocalTime( &sys );
allt2[dpos] = sys.wHour*3600000+sys.wMinute*60000+sys.wSecond*1000+sys.wMilliseconds;
//allflux[dpos] = (allflux2[dpos] - allflux1[dpos])/(allt2[dpos] - allt1[dpos]);//n就是上一分钟总流量
allflux[dpos] = (allflux2[dpos] - all
- 1
- 2
- 3
- 4
前往页