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/////////////////////////////////////////////////////////
没有评论:
发表评论