2011年5月23日星期一

  Iphlpapi.dll的应用

Iphlpapi可以用于获取计算机的网络接口信息,win98以上的系统均有Iplhlpapi.dll动态链接库的存在,只需包含iphlpapi就可以调用其中的相关函数。在vs2008中,要使用该动态链接库中的函数需要添加:

#include

#pragma comment(lib,"iphlpapi.lib")

从功能上来区分,iphlpapi.dll提供的函数可以分为以下几类:获取本机网络接口信息、获取TCP连接信息、获取UDP连接信息、获取ICMP信息、获取网络参数、获取地址映射表、获取IP信息、获取路由信息、获取地址解析协议信息。具体下面进行介绍。

获取本机网络接口信息:

*******************************************************************************

ULONG WINAPI GetAdaptersInfo(PIP_ADAPTER_INFO AdapterInfo, PULONG SizePointer );

返回一个PIP_ADAPTER_INFO的链表,链表大小由SizePointer给定,如果给定的大小不足,则函数返回错误,并将所需空间通过SizePointer返回,这样就可以再次调用以获得准确的结果。因此通常采用两次调用的方式来使用该函数。PIP_ADAPTER_INFO为一个IP_ADAPTER_INFO类型的指针:

////////////////////////////////////////////////////////////////////////////IP_ADAPTER_INFO/////////////////////////////////////////////////////////

typedef struct _IP_ADAPTER_INFO {

struct _IP_ADAPTER_INFO* Next;//下一个结构体

    DWORD ComboIndex;//保留未用

char AdapterName[MAX_ADAPTER_NAME_LENGTH + 4];//网络适配器名

char Description[MAX_ADAPTER_DESCRIPTION_LENGTH + 4];//对网络适配器的描述,实际上是驱动程序的名字

    UINT AddressLength;//物理地址长度,注意不同的网络适配器物理地址格式是不一样的。

    BYTE Address[MAX_ADAPTER_ADDRESS_LENGTH];//物理地址,一个字节存放一个十六进制数

    DWORD Index;//适配器索引号

    UINT Type;//适配器类型,可以的类型有{MIB_IF_TYPE_ETHERNET 6 以太网适配器、MIB_IF_TYPE_TOKENRING 9 令牌环适配器、MIB_IF_TYPE_FDDI 15 光纤接口适配器、MIB_IF_TYPE_PPP 23 点到点协议适配器、MIB_IF_TYPE_LOOPBACK 24 回环(Loopback)适配器、MIB_IF_TYPE_SLIP 28 串行适配器、MIB_IF_TYPE_OTHER 其他值 其他类型的适配器}

    UINT DhcpEnabled;//适配器是否启用了动态主机配置协议(DHCP)

    PIP_ADDR_STRING CurrentIpAddress;//当前IP地址

    IP_ADDR_STRING IpAddressList;//绑定到此适配器的IP地址链表

    IP_ADDR_STRING GatewayList;//默认网关地址链表

    IP_ADDR_STRING DhcpServer;//DHCP服务器地址,DhcpEnabled=TRUE时有效

    BOOL HaveWins;//是否启用WINS

    IP_ADDR_STRING PrimaryWinsServer;//主WINS地址

    IP_ADDR_STRING SecondaryWinsServer;//辅WINS地址

    time_t LeaseObtained;//向DHCP服务器租用IP地址的时间,DhcpEnabled=TRUE时有效

    time_t LeaseExpires;//向DHCP服务器租用IP地址到期时间,DhcpEnabled=TRUE时有效

} IP_ADAPTER_INFO, *PIP_ADAPTER_INFO;

////////////////////////////////////////////////////////////////////////////IP_ADAPTER_INFO/////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////IP_ADDR_STRING////////////////////////////////////////////////////////////

typedef struct _IP_ADDR_STRING {

struct _IP_ADDR_STRING* Next;//指向列表中下一个IP_ADDR_STRING类型。为空则是最后一个地址

    IP_ADDRESS_STRING IpAddress;//点式十进制字串表示Ip地址

    IP_MASK_STRING IpMask;//子网掩码

    DWORD Context;//网络IP地址标识,符合AddIPAddress和DeleteIPAddress函数中的网络接口关联参数

} IP_ADDR_STRING, *PIP_ADDR_STRING;

///////////////////////////////////////////////////////////////////////////IP_ADDR_STRING////////////////////////////////////////////////////////////

DWORD WINAPI GetIfTable(PMIB_IFTABLE pIfTable,PULONG pdwSize,BOOL bOrder);

通过调用该函数后查询其中返回的参数可以确认网络的连通性。可以从操作系统维护的MIB库中读出本机各个接口的当前信息,如接口数目、类型、速率、物理地址、接收/发送字节数、错误字节数等。

///////////////////////////////////////////////////////////////////////////MIB_IFTABLE///////////////////////////////////////////////////////////////////

typedef struct _MIB_IFTABLE {

    DWORD dwNumEntries;//入口数

    MIB_IFROW table[ANY_SIZE];//表格

} MIB_IFTABLE, *PMIB_IFTABLE;

typedef struct _MIB_IFROW {

    WCHAR wszName[MAX_INTERFACE_NAME_LEN];//接口名称字符串,必须为512字节

    IF_INDEX dwIndex;//接口编号

    IFTYPE dwType;//接口类型,参见IP_ADAPTER_INFO结构的Type成员

    DWORD dwMtu;//最大传输单元

    DWORD dwSpeed;//接口速率(字节)

    DWORD dwPhysAddrLen;//由bPhysAddr获得的物理地址有效长度

    UCHAR bPhysAddr[MAXLEN_PHYSADDR];//物理地址

    DWORD dwAdminStatus;//接口管理状态

    INTERNAL_IF_OPER_STATUS dwOperStatus;//操作状态,可以的取值为{MIB_IF_OPER_STATUS_NON_OPERATIONAL 0 网络适配器被禁止,例如:地址冲突, MIB_IF_OPER_STATUS_UNREACHABLE 1 没有连接, MIB_IF_OPER_STATUS_DISCONNECTED 2 局域网:电缆未连接;广域网:无载波信号, MIB_IF_OPER_STATUS_CONNECTING 3 广域网适配器连接中, MIB_IF_OPER_STATUS_CONNECTED 4 广域网适配器连接上远程对等点, MIB_IF_OPER_STATUS_OPERATIONAL 5 局域网适配器默认状态}

    DWORD dwLastChange;//操作状态最后改变的时间

    DWORD dwInOctets;//总共收到字节

    DWORD dwInUcastPkts;//总共收到unicast包数

    DWORD dwInNUcastPkts;//总共收到non-unicast包数

    DWORD dwInDiscards;//收到后丢弃包总数

    DWORD dwInErrors;//收到出错包数

    DWORD dwInUnknownProtos;//收到后因协议不明而丢弃的包总数

    DWORD dwOutOctets;//发送字节

    DWORD dwOutUcastPkts;//发送unicast包总数

    DWORD dwOutNUcastPkts;//发送non-unicast包数

    DWORD dwOutDiscards;//发送丢弃包总数

    DWORD dwOutErrors;//发送出错包总数

    DWORD dwOutQLen;//发送队列长度

    DWORD dwDescrLen;//bDescr部分有效长度

    UCHAR bDescr[MAXLEN_IFDESCR];//接口描述

} MIB_IFROW, *PMIB_IFROW;

///////////////////////////////////////////////////////////////////////////MIB_IFTABLE////////////////////////////////////////////////////////////

*******************************************************************************

获取TCP连接信息

*******************************************************************************

ULONG WINAPI GetTcpStatistics(PMIB_TCPSTATS Statistics );获得本机TCP连接的相关信息

ULONG WINAPI GetTcpTable(PMIB_TCPTABLE TcpTable,PULONG SizePointer,BOOL Order );获取当前TCP连接情况

///////////////////////////////////////////////////////////////////////////MIB_TCPSTATS_LH/////////////////////////////////////////////////////////

typedef struct _MIB_TCPSTATS_LH {

union {

        DWORD dwRtoAlgorithm;//指定重传输(RTO:retransmission time-out)算法

        TCP_RTO_ALGORITHM RtoAlgorithm;

    };

    DWORD dwRtoMin;//重传输超时的最小值,毫秒

    DWORD dwRtoMax;//重传输超时的最大值,毫秒

    DWORD dwMaxConn;//连接最大数目,如果为-1,则连接的最大数目是可变的

    DWORD dwActiveOpens;//主动连接数目,即客户端正向服务器进行连接数目

    DWORD dwPassiveOpens;//被动连接数目,即服务器监听连接客户端请求数目

    DWORD dwAttemptFails;//尝试连接失败的次数

    DWORD dwEstabResets;//对已建立的连接实行重设的次数

    DWORD dwCurrEstab;//目前已建立的连接

    DWORD dwInSegs;//收到分段数据报的数目

    DWORD dwOutSegs;//传输的分段数据报数目,不包括转发的数据包

    DWORD dwRetransSegs;//转发的分段数据报数目

    DWORD dwInErrs;//收到错误的数目

    DWORD dwOutRsts;//重设标志设定后传输分段数据报数目

    DWORD dwNumConns;//累计连接的总数

} MIB_TCPSTATS_LH, *PMIB_TCPSTATS_LH;

///////////////////////////////////////////////////////////////////////////MIB_TCPSTATS_LH/////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////MIB_TCPTABLE/////////////////////////////////////////////////////////

typedef struct _MIB_TCPTABLE {

    DWORD dwNumEntries;//当前包含MIB_TCPROW类型的总数

    MIB_TCPROW table[ANY_SIZE];

} MIB_TCPTABLE, *PMIB_TCPTABLE;

typedef struct _MIB_TCPROW_LH {

union {

        DWORD dwState;       // Old field used DWORD type.

        MIB_TCP_STATE State; // New field uses enum type.

};

//TCP连接状态,为以下值之一

{MIB_TCP_STATE_CLOSED 1 关闭,

MIB_TCP_STATE_LISTEN 2 正在监听,

MIB_TCP_STATE_SYN_SENT 3 同步发送,

MIB_TCP_STATE_SYN_RCVD 4 同步接收,

MIB_TCP_STATE_ESTAB 5 已建立,

MIB_TCP_STATE_FIN_WAIT1 6 FINWAIT 1,

MIB_TCP_STATE_FIN_WAIT2 7 FINWAIT 2,

MIB_TCP_STATE_CLOSE_WAIT 8 关闭等待,

MIB_TCP_STATE_CLOSING 9 正在关闭,

MIB_TCP_STATE_LAST_ACK 10 最后一次确认,

MIB_TCP_STATE_TIME_WAIT 11 时间等待,

MIB_TCP_STATE_DELETE_TCB 12 删除连接}

    DWORD dwLocalAddr;//本地IP

    DWORD dwLocalPort;//本地端口

    DWORD dwRemoteAddr;//远程机器IP

    DWORD dwRemotePort;//远程机器端口

} MIB_TCPROW_LH, *PMIB_TCPROW_LH;

///////////////////////////////////////////////////////////////////////////MIB_TCPTABLE/////////////////////////////////////////////////////////

没有评论:

发表评论