网络编程:如何取得当前各种网络连接的状态

来源:互联网 发布:mac double gleam 编辑:程序博客网 时间:2024/05/17 03:21

近几天接到一个任务,要在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 中的内容去判断需要的是哪个连接的信息,并且去处理这些信息了。

原创粉丝点击