近几天接到一个任务,要在WINCE 6.0下做一个GPRS的流量统计软件,因为之前完全没有接触过这个方面,所以很是头疼,完全没有思路,不过经过几天在网上的搜索,找到了两种方案。
第一个是使用WINDOWS的IP HELPER相关函数,这些函数在iphlpapi.dll中。如果你更习惯静态调用,那么可以在你的SDK中寻找iphlpapi.h和iphlpapi.lib。包含到你的工程中就可以使用。
第二个是使用原始套接字raw socket。一个一个的去计算数据包的大小。
先来看第一种,如果你使用动态调用,那么你需要定义两个结构,关于这两个结构的详细说明可以再MSDN上找到
http://msdn.microsoft.com/en-us/library/aa366836(v=VS.85).aspx
typedef struct _MIB_IFROW
{
WCHAR wszName[MAX_INTERFACE_NAME_LEN];
DWORD dwIndex;
DWORD dwType;
DWORD dwMtu;
DWORD dwSpeed;
DWORD dwPhysAddrLen;
BYTE bPhysAddr[MAXLEN_PHYSADDR];
DWORD dwAdminStatus;
DWORD dwOperStatus;
DWORD dwLastChange;
DWORD dwInOctets;
DWORD dwInUcastPkts;
DWORD dwInNUcastPkts;
DWORD dwInDiscards;
DWORD dwInErrors;
DWORD dwInUnknownProtos;
DWORD dwOutOctets;
DWORD dwOutUcastPkts;
DWORD dwOutNUcastPkts;
DWORD dwOutDiscards;
DWORD dwOutErrors;
DWORD dwOutQLen;
DWORD dwDescrLen;
BYTE bDescr[MAXLEN_IFDESCR];
} MIB_IFROW,*PMIB_IFROW;
typedef struct _MIB_IFTABLE
{
DWORD dwNumEntries; //连接格式
MIB_IFROW table[ANY_SIZE];//连接信息
} MIB_IFTABLE, *PMIB_IFTABLE;
然后定义变量
MIB_IFROW *pIfRow;
#define MAX_INTERFACE_NAME_LEN 256
#define MAXLEN_PHYSADDR 8
#define MAXLEN_IFDESCR 256
#define ANY_SIZE 1
然后调用iphlpapi的GetIfTable函数,就可以把这个数据结构填满,注意GetIfTable必须要调用两次,第一次确定大小,第二次才能正确的填充。
if (lpGetIfTable(pMIT, &dwSize, 0) == ERROR_INSUFFICIENT_BUFFER)
{
delete []pMIT;
pMIT = new MIB_IFTABLE[dwSize];
}
//dwNumEntries alwayse>=1, and the last entry is loopback interface.
if (lpGetIfTable(pMIT, &dwSize, 0) == NO_ERROR)
{
for (int i = 0; i < (int) pMIT->dwNumEntries; i++)
{
pIfRow = (MIB_IFROW *) & pMIT->table[i];
}
}
接下来就可以根据pIfRow 中的内容去判断需要的是哪个连接的信息,并且去处理这些信息了。