您的位置:首页 > 其它

IP Helper API 简介

2013-03-21 22:41 501 查看
IP Helper 是一套用于管理本地网络设置的API。使用这一套API可以方便的改变计算机的网络设置或者提取有关的信息。而且它还提供了一种消息机制,能够在本地计算 机的网络设置发生改变时通知应用程序。实际上,它不仅仅能够提取本机的网络设置信息,还能够获得网络上其它计算机的IP使用情况和MAC地址。
从最简单的开始

最简单的是查看计算机上的网络设置是什么而不修改。

提取网卡信息

hInst=LoadLibrary("iphlpapi.dll");

if(!hInst)

cout<<"iphlpapi.dll not supported in this platform!\n";

这三行代码的作用是加载iphlpapi库文件,

下面的几行代码显示了调用DLL中函数的过程:

pGAInfo=(PGAINFO)GetProcAddress(hInst,"GetAdaptersInfo");

ULONG ulSize=0;

pGAInfo(pInfo,&ulSize);

pInfo=(PIP_ADAPTER_INFO)new(char[ulSize]);

pGAInfo(pInfo,&ulSize);

第 一行代码是获得函数GetAdaptersInfo的入口地址,以便在后面通过指针调用函数。这个函数的功能是提取网卡的信息,并接收两个参数,第一个参 数是用来保存网卡信息的内存缓冲的首地址,而第二个参数是这个缓冲的大小。由于事先不知道本地机器上有多少张网卡,所以也就没法知道应该分配多大的缓存。 好在GetAdaptersInfo函数在缓冲的大小不够时会在第二个参数也就是ulSize中填入应该分配的缓冲的大小。这样,就可以调用两次 GetAdaptersInfo,第一次是获取缓冲区的大小,然后分配这个缓冲以后再次调用它以获得实际的网卡信息。

GetAdaptersInfo通过pInfo返回的信息是以链表的方式组织的,下面就是访问链表的代码:

while(pInfo)

{

//访问网卡数据

//将当前指针移向下一个结点

pInfo=pInfo->Next;

}

为了说明问题,省略了其中的代码。

下面看看GetAdaptersInfo都返回了些什么样的信息,下面是对pInfo所指向的数据结构的解释:

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];//物理地址,每个字节存放一个十六进制的数值,配合上一个数据域在printf中用x格式把每个字节输出。

DWORD Index;//网卡索引号

UINT Type;//网卡类型

UINT DhcpEnabled;//是否启用了DHCP动态IP分配

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租借获取的时间

time_t LeaseExpires;//当前DHCP租借失效时间。这两个数据结构只有在启用了DHCP时才有用。

} IP_ADAPTER_INFO, *PIP_ADAPTER_INFO;


这个数据结构中的几个IP地址字符串IpAddressList、GatewayList等等都是以链表的方式组织的。实际上所有数据都可以在控制面板|网络|属性|TCP/IP的属性页的高级选项里看见

提取网络接口信息

其 中最主要的两个函数是GetNumberOfInterfaces和GetInterfaceInfo,前者指出网络接口的个数,后者提取网络接口的信 息。对于第一个函数要说明的一点,据MSDN描述:一个网络接口是网卡的逻辑抽象,它们是一对一的关系。实际上,因为每个系统都附加有一个调试用的网络接 口,这个接口的IP地址是127.0.0.1子网掩码是255.0.0.0。由GetInterfaceInfo返回的 IP_INTERFACE_INFO结构中也有一个NumAdapters整型的数据域记录了正确的网卡。然后对于GetInterfaceInfo要注
意的是它也必须被调用两次,第一次获取缓冲大小,第二次才是取值。GetInterfaceInfo返回的IP_INTERFACE_INFO不象上面的 结构是用链表,而是用的动态数组的方法,所以遍历其中每一个元素的代码变成:

for(int i=0;iNumAdapters;i++)

{

cout<<"Adapter index:"<<Adapter[i].Index<<Adapter[i].Name<<endl;

}

IP_INTERFACE_INFO结构的解释如下:

typedef struct _IP_INTERFACE_INFO {

LONG NumAdapters;// 动态数组中网络接口元素的个数,通过它来遍历数组

IP_ADAPTER_INDEX_MAP Adapter[1];// 网络接口数据数组

} IP_INTERFACE_INFO,*PIP_INTERFACE_INFO;


其中的IP_ADAPTER_INDEX_MAP结构如下:

typedef struct _IP_ADAPTER_INDEX_MAP {

ULONG Index;// 网卡索引

WCHAR Name[MAX_ADAPTER_NAME];// 网卡名

} IP_ADAPTER_INDEX_MAP, * PIP_ADAPTER_INDEX_MAP;


提取IP信息

这部分提取网络接口信息部分是相同的。

设置本地网络

设置的过程与提取过程类似。

其它的API函数

这 些函数能够察看或者设置网络数据报文方面的信息。比方GetIpStatistics、GetIcmpStatistics函数能够查看当前IP数据报和 ICMP数据报的流量,以及废弃的数据报数量等等。使用这些函数可以构建网络监控程序检查网络中的故障。也可以使用SetIpStatistics 函数来设置相应的IP协议栈属性,缩短或者延长IP数据报的缺省TTL值。也可以使用GetIpForwardTable、 CreateIpForwardEntry 、DeleteIpForwardEntry、SetIpForwardEntry来分别获取IP路由表的信息,创建路由表项,删除路由表项和修改路由表
项。也可以用GetBestRoute、 GetBestInterface获得到达指定IP的最好的路由点和网络接口。

事实上,通过这些函数可以得到许多MIB变量(《使用TCP/IP协议实现网际互联》第二卷),通过这些MIB变量,可以非常快速的***一个网络管理软件。

IP Helper API中SendARP函数。它能够简单的发送ARP数据包并返回目标机器的MAC地址。

这套API提供的当网络设置改变时向应用程序发出消息的异步通知功能。因为它们非常简单,与WINSOCK中WSAAsyncSelect的使用方法是一样的,就不再说明了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: