GetAdaptersAddresses使用小结

这几天想复习下Windows C socket网络编程,网上查阅了一些资料,大部分资料还是比较老的,介绍的都是旧接口函数,而且,绝大多数书上的内容都没有介绍API中支持ipv6的接口。

 

我在写一个获得本地网卡信息的函数的时候,本来想用GetAdapterInfo,由于很久没用过win32 api,于是查了下MSDN,发现这个接口已经很旧了,而且不支持ipv6,在文档中明确推荐使用GetAdaptersAddresses接口,查了下,除了支持IPV6,使用方式跟GetAdapterInfo差别倒是不大,但是数据结构复杂很多,特别是获得网卡信息的句柄结构体,挺复杂的,google了一下,想找几个sample,搜了半天就只有msdn上那一个不太好的sample而已,在CSDN上搜了一下,资料也非常有限,有的人甚至说用这个函数无法获得DNS地址,因此仍然推荐老的GetAdapterInfo,我自己试了下,还是可以获得地址信息的,无论是硬件地址还是网络地址,只不过麻烦一些,但都可以得到,而且还提供了很多额外信息,比GetAdapterInfo更全面的信息,因此这个接口函数在将来应该是会很有用。

 

这个函数的接口声明是这样的:

ULONG WINAPIGetAdaptersAddresses(

  __in     ULONGFamily,

  __in     ULONGFlags,

  __in     PVOIDReserved,

  __inout  PIP_ADAPTER_ADDRESSESAdapterAddresses,

  • 4
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
要禁用 Windows 上的某个网卡使用 IPv6,可以通过以下步骤实现: 1. 打开“控制面板”。 2. 选择“网络和共享中心”。 3. 选择“更改适配器设置”。 4. 找到要禁用 IPv6 的网络连接,右键单击选择“属性”。 5. 在“连接属性”窗口中,找到“Internet 协议版本 6(TCP/IPv6)”并取消勾选。 6. 单击“确定”按钮保存更改。 如果你想在 C++ 代码中禁用特定的网卡使用 IPv6,可以使用以下代码: ```c++ #include <winsock2.h> #include <ws2tcpip.h> #include <iphlpapi.h> #pragma comment(lib, "iphlpapi.lib") int main() { ULONG flags = GAA_FLAG_SKIP_ANYCAST | GAA_FLAG_SKIP_MULTICAST | GAA_FLAG_SKIP_DNS_SERVER; DWORD dwSize = 0; DWORD dwRetVal = 0; PIP_ADAPTER_ADDRESSES pAddresses = NULL; PIP_ADAPTER_ADDRESSES pCurrAddresses = NULL; dwRetVal = GetAdaptersAddresses(AF_UNSPEC, flags, NULL, pAddresses, &dwSize); if (dwRetVal == ERROR_BUFFER_OVERFLOW) { pAddresses = (IP_ADAPTER_ADDRESSES*) malloc(dwSize); if (pAddresses == NULL) { printf("Memory allocation failed\n"); return 1; } } dwRetVal = GetAdaptersAddresses(AF_UNSPEC, flags, NULL, pAddresses, &dwSize); if (dwRetVal != NO_ERROR) { printf("GetAdaptersAddresses failed: %d\n", dwRetVal); free(pAddresses); return 1; } pCurrAddresses = pAddresses; while (pCurrAddresses) { IP_ADAPTER_UNICAST_ADDRESS* pUnicast = pCurrAddresses->FirstUnicastAddress; while (pUnicast) { if (pUnicast->Address.lpSockaddr->sa_family == AF_INET6) { // 禁用 IPv6 pUnicast->OnLinkPrefixLength = 255; } pUnicast = pUnicast->Next; } pCurrAddresses = pCurrAddresses->Next; } free(pAddresses); return 0; } ``` 在这段代码中,我们使用 Winsock 的 `GetAdaptersAddresses` 函数获取所有网卡的信息,然后遍历每个网卡的单播地址,将 IPv6 地址的前缀长度设置为 255,从而禁用 IPv6。注意,在此之前需要包含头文件 `iphlpapi.h`。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值