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所指向的数据结构的解释:
这个数据结构中的几个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结构的解释如下:
其中的IP_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的使用方法是一样的,就不再说明了。
从最简单的开始
最简单的是查看计算机上的网络设置是什么而不修改。
提取网卡信息
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的使用方法是一样的,就不再说明了。
相关文章推荐
- IP Helper API 简介
- IP Helper API 简介
- IP Helper API 简介 (zz)
- IP Helper API 简介(转)
- IP Helper API 简介与设置网卡的IP地址
- IP Helper API 简介
- IP Helper API 简介
- IP Helper API 简介 (zz)
- IP Helper API
- 利用Ip Helper Api 来得到局域网中计算机MAC 地址的一个程序
- IP Helper API 使用方法
- IPControl安装及API使用简介
- IP Helper API 使用方法
- DNSPOD API 域名的动态IP的更新脚本
- 主流的工业以太网简介及比较(EPA , EtherCAT , Ethernet Powerlink , PROFINET, Ethernet/IP, SERCOS III)
- java.net.URI 简介 文档 API
- 【解决】在 IPMONTR.DLL 中初始化函数 INITHELPERDLL 启动失败,错误代码为 10107
- 使用百度api根据ip获取位置
- 文件的概念以及VC里的一些文件操作API简介
- tcp/ip 协议族简介