※==================================================================
※本连载文章说明:
※1、连载首发于《软件报》(http://www.sweek.com)2006年21期(2006年5月22日);
※2、此次网上连载采用的是原稿件结构,内容与《软件报》发表略有不同;
※3、谢绝除《软件报》及其相关刊物之外的传统媒体部分或全部转载;
※4、谢绝任何收费媒体、网络转载;
※5、原作者:uruseibest ,blog:http://blog.csdn.net/uruseibest;
※6、如有其它疑问,请联系作者;
※7、如有转载,必须连同本说明一并发表,否则将追究转载者责任。
※======================================================================
第二十一节 增加和删除一个IP地址
1、函数:
①Private Declare Function AddIPAddress Lib "iphlpapi.dll" ( ByVal Address As Long, ByVal IpMask As Long, ByVal Ifindex As Long, NTEContext As Long, NTEInstance As Long) As Long
参数说明:
Address:[输入]要增加的IP地址
IpMask:[输入]IP地址的子网掩码
IfIndex:[输入]增加IP地址的适配器,实际值为MIB_IPADDRTABLE.table(适配器编号).dwIndex
NTEContext:[输出]成功则指向一个与这个IP地址关联的网络表接口(Net Table Entry:NTE)ULONG变量。调用者可以在稍后使用这个关系到调用DeleteIPAddress。
NTEInstance:[输出]成功则指向这个IP地址的网络表接口(Net Table Entry:NTE)实例。
返回值:成功,返回0;失败,返回错误代码。
备注:①增加的IP是临时的,当系统重新启动或者发生其它的PNP事件的时候这个IP就不存在了,比如将网卡禁用,然后启用,就会发现之前调用函数AddIPAddress增加的的IP地址不存在了。②有时候,调用这个函数,可能造成网络出错、系统Arp映射错误等,但可以禁用/启用网卡恢复成正常状态。。
②Private Declare Function DeleteIPAddress Lib "iphlpapi.dll" (ByVal NTEContext As Long) As Long
参数说明:
NTEContext:[输入] IP地址关联的网络表接口(Net Table Entry:NTE),这个关联是之前用AddIPAddress所创建的,在调用函数GetAdaptersInfo后,从获得的IP_ADAPTER_INFO. IpAddressList. Context 中也可获得这个参数的值
返回值:成功,返回0;失败,返回错误代码。
备注:实际上函数DeleteIPAddress只能删除由函数AddIPAddress创建的IP地址。
③Private Declare Function GetIpAddrTable Lib "iphlpapi.dll" (pIpAddrTable As MIB_IPADDRTABLE, pdwSize As Long, bOrder As Long) As Long
参看本章第九节 1、
④Private Declare Function GetAdaptersInfo Lib "iphlpapi.dll" (IpAdapterInfo As Any, pOutBufLen As Long) As Long
参看本章第一节 1、
2、使用到的类型:
①MIB_IPADDRTABLE 包含IP地址入口表
参看本章第九节 2、①
②MIB_IPADDRROW 指定特殊IP地址的信息
参看本章第九节 2、②
③IP_ADAPTER_INFO类型:包含本机网络适配器信息。
参看本章第一节 1、①
④IP_ADDR_STRING描述IP 地址链表的节点。
参看本章第一节 1、②
3、使用到的常量:
Const MAX_ADAPTER_NAME_LENGTH = 260
Const MAX_ADAPTER_ADDRESS_LENGTH = 8
Const MAX_ADAPTER_DESCRIPTION_LENGTH = 132
4、主要代码分析:
①使用函数GetIpAddrTable获取某个要增加IP的适配器的dwIndex:
Dim IpAddrTable As MIB_IPADDRTABLE
dwsize = Len(IpAddrTable)
r = GetIpAddrTable(IpAddrTable, dwsize, order)
②传入IP地址和Mask地址的长整数形式,使用函数AddIPAddress增加地址,返回的NteC 将用于函数DeleteIPAddress,函数的返回值为0表示成功 :
Addr = inet_addr("192.168.1.5")
IpM = inet_addr("255.255.255.0")
r = AddIPAddress(Addr, IpM, IpAddrTable.table(1).dwIndex, NteC, NteI)
③调用函数DeleteIPAddress,返回值为0表示成功:
r = DeleteIPAddress(NteC)
备注:增加删除IP地址最好的方法是将Ntec的值记录下来,如果实在没有记录,那么可以调用函数GetAdaptersInfo获得网络适配器信息,然后获得要删除的IP地址的网络接口表:IP_ADDR_STRING.Context,这个值实际就是Ntec的值。
5、运行时截图: