我需要从C/C++程序中更改特定网络接口的IP地址和子掩码。在Windows文档中,我发现应该使用Windows API中的AddIPAddress()
/DeleteIpAddress()
。但是,例如DeleteIpAddress()
需要一个NTEContext
作为参数。我发现an example使用GetAdaptersInfo()
来获取接口和上下文的索引。但是,该页面还明确声明:
在Windows XP和更高版本上:使用获取适配器地址函数,而不是获取适配器信息。
但是,当GetAdaptersInfo()
填充其中存在索引/NTEcontext的IP_ADAPTER_INFO
结构体时,GetAdaptersAddresses()
提供了其中不存在此类成员的IP_ADAPTER_ADDRESSES
结构体。
我应该如何使用较新的GetAdaptersAddresses()
函数来获取接口的索引/上下文?
2条答案
按热度按时间xam8gpfp1#
基于https://learn.microsoft.com/en-us/windows/win32/iphlp/managing-network-adapters,您应该能够使用以下内容:
GetAdapterIndex
GetPerAdapterInfo
IP_PER_ADAPTER_INFO_W2KSP1
IP_ADDR_STRING
类似这样的方法应该可以奏效:
P.S.对于旧版本的Windows,这可能会工作:https://microsoft.public.vb.winapi.narkive.com/TW7rVsdu/how-to-obtain-ntecontext-for-use-in-deleteipaddress-without-first-calling-addipaddress
lg40wkob2#
此示例检索与系统关联的适配器的IP_ADAPTER_ADDRESSES结构,并打印每个适配器接口的一些成员。
以下示例检索IP地址表以确定第一个适配器的接口索引,然后将命令行中指定的IP地址添加到第一个适配器。添加的IP地址随后被删除。
我把这两个程序结合在一起并修改了代码。
可以输出网卡描述、IP地址、MAC地址、DNS地址,也可以将IP地址添加到第一个网卡上,也可以删除相同的地址。
**注意:**DeleteIPAddress()函数用于删除先前使用AddIPAddress()添加的IP地址。如果您只是使用AddIPAddress()添加IP地址,则在添加IP地址之后需要手动删除。
此图为添加的IP,您可以通过左侧的“编辑”删除添加的IP。
下面是代码: