我有一个在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个多播 来自它的地址?
谢谢,
比尔
答案 0 :(得分:0)
您可能正在寻找GetAdaptersInfo,记录在:http://msdn.microsoft.com/en-us/library/aa365917%28VS.85%29.aspx