来自Windows 2000(WIN2KSP4)中的GetAdaptersAddresses()的等效信息?

时间:2010-02-06 19:51:47

标签: windows networking

我有一个在Windows XP上使用 GetAdaptersAddresses ()的C ++(VS2005)应用程序,我需要提供IP_ADAPTER_ADDRESSES中与IPv4相关的大部分相同信息(我不需要IPv6)在Windows 2000(WIN2KSP4)中。

(无法选择适用于Windows 2000的IPv6技术预览版)

请注意,在查看MSDN时,应该是“要求”下的内容 “支持的最低客户端:Windows 2000 Professional”(尽管我确实知道MSDN并不总是正确的*)

GetAdaptersAddresses 的调用如下所示:

// flags = GAA_FLAG_INCLUDE_PREFIX | GAA_FLAG_SKIP_DNS_SERVER | GAA_FLAG_SKIP_FRIENDLY_NAME
GetAdaptersAddresses(AF_INET, flags, NULL, reinterpret_cast<IP_ADAPTER_ADDRESSES*>(info), &actualSize)

我看起来像 IP_ADAPTER_ADDRESSES 的版本:
(不需要打击的字段)

typedef struct _IP_ADAPTER_ADDRESSES {
  union {
    ULONGLONG Alignment;
    struct {
      ULONG Length;
      DWORD IfIndex;
    } ;
  } ;
  struct _IP_ADAPTER_ADDRESSES *Next;
  PCHAR                              AdapterName;
  PIP_ADAPTER_UNICAST_ADDRESS        FirstUnicastAddress;
  PIP_ADAPTER_ANYCAST_ADDRESS        FirstAnycastAddress;
  PIP_ADAPTER_MULTICAST_ADDRESS      FirstMulticastAddress;
  PIP_ADAPTER_DNS_SERVER_ADDRESS     FirstDnsServerAddress;
  PWCHAR                             DnsSuffix;
  PWCHAR                             Description;
  PWCHAR                             FriendlyName;
  BYTE                               PhysicalAddress[MAX_ADAPTER_ADDRESS_LENGTH];
  DWORD                              PhysicalAddressLength;
  DWORD                              Flags;
  DWORD                              Mtu;
  DWORD                              IfType;
  IF_OPER_STATUS                     OperStatus;
  DWORD                              Ipv6IfIndex;
  DWORD                              ZoneIndices[16];
  PIP_ADAPTER_PREFIX                 FirstPrefix;
} IP_ADAPTER_ADDRESSES, *PIP_ADAPTER_ADDRESSES;

通过组合调用:

  GetIpAddrTable       (MIB_IPADDRTABLE, MIB_IPADDRROW)  
  GetAdaptersInfo      (IP_ADAPTER_INFO)  
  GetIfTable           (MIB_IFTABLE, MIB_IFROW)  
  GetIfEntry           (MIB_IFROW)  

我可以获得一些我需要的信息:

  AdapterName
  FirstUnicastAddress   // I think I have this
  PhysicalAddress          // MAC address
  PhysicalAddressLength
  Flags
  Mtu                      // only available from MIB_IFROW
  IfType

这给我留下了问题,还有3个问题:

1)IF_OPER_STATUS OperStatus!=来自MIB_IFROW的dwOperStatus
任何人都有关于如何获得平等信息或与其接近的信息的想法?

2)我相信我已经从IP_ADAPTER_INFO找到了与IP_ADDR_STRING IpAddressList相同的FirstUnicastAddress。假设我是正确的(我是吗?),我怎么能确定地址的顺序是一样的; FirstUnicastAddress的第一个地址是否与IpAddressList中的第一个地址相同?是的,如果列表中有多个地址,那么横向列表将是有用的。

3)FirstMulticastAddress:由于我对多播的了解有限,因此获取此信息变得更加困难。  我原以为使用带有SIO_GET_INTERFACE_LIST的WSAIoctl会让我得到一个答案,但不是。我最近  一直在尝试使用带有IP_MULTICAST_IF的getsockopt。到目前为止,我只是设法返回4个字节,并将ip_mreq.imr_multiaddr设置为0.0.0.0。因为GetAdaptersAddresses返回,我希望我的用户错误  我的网卡有2个地址,有1个地址用于环回。那么,我如何获得所有多播地址  与每个界面相关联?如果我确实让getsockopt调用工作,我如何获得多于1个多播  来自它的地址?

谢谢,

比尔

1 个答案:

答案 0 :(得分:0)

您可能正在寻找GetAdaptersInfo,记录在:http://msdn.microsoft.com/en-us/library/aa365917%28VS.85%29.aspx