IP Helper

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的使用方法是一样的,就不再说明了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值