gpt4 book ai didi

c - 从 GetAdaptersAddresses() 获取 IP_ADDRESS_STRING?

转载 作者:可可西里 更新时间:2023-11-01 13:06:40 25 4
gpt4 key购买 nike

GetAdaptersAddresses()将为您提供 IP_ADAPTER_UNICAST_ADDRESS 格式的地址,其定义为:

typedef struct _IP_ADAPTER_UNICAST_ADDRESS {
union {
struct {
ULONG Length;
DWORD Flags;
} ;
} ;
struct _IP_ADAPTER_UNICAST_ADDRESS *Next;
SOCKET_ADDRESS Address;
IP_PREFIX_ORIGIN PrefixOrigin;
IP_SUFFIX_ORIGIN SuffixOrigin;
IP_DAD_STATE DadState;
ULONG ValidLifetime;
ULONG PreferredLifetime;
ULONG LeaseLifetime;
UINT8 OnLinkPrefixLength;
} IP_ADAPTER_UNICAST_ADDRESS, *PIP_ADAPTER_UNICAST_ADDRESS;

似乎暗示人类可读 IP 地址字符串的唯一字段是地址,它是一个 SOCKET_ADDRESS 结构,定义为:

typedef struct _SOCKET_ADDRESS {
LPSOCKADDR lpSockaddr;
INT iSockaddrLength;
} SOCKET_ADDRESS, *PSOCKET_ADDRESS;

反过来,它使用另一个结构 SOCKADDR,定义为:

抱歉,在此处发帖比较复杂,因为它因 IPv4 与 IPv6 和 Windows 版本而异……所以这里是定义的链接:

http://msdn.microsoft.com/en-us/library/ms740496%28v=VS.85%29.aspx

如果您还没有像我一样头晕目眩并遵循这个迷宫般的定义,您可能会注意到检索 IP 地址的旧点分字符串样式是一场噩梦,因为它过去更容易使用GetAdaptersInfo() .

我的问题是:是否有真正 IP Helper 函数可以将 IP_ADAPTER_UNICAST_ADDRESS 转换为 IPv4 点分字符串(或 IPv6 字符串)?

最佳答案

您可以使用 GetIpAddrTable - returned data structure包含一个 DWORD dwAddr,即 IPv4 地址。第一个链接上的示例代码应该会显示您想要的内容。简短摘录向您展示我的意思:

if ( (dwRetVal = GetIpAddrTable( pIPAddrTable, &dwSize, 0 )) != NO_ERROR ) { 
printf("GetIpAddrTable failed with error %d\n", dwRetVal);
if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwRetVal, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) & lpMsgBuf, 0, NULL)) {
printf("\tError: %s", lpMsgBuf);
LocalFree(lpMsgBuf);
}
exit(1);
}

printf("\tNum Entries: %ld\n", pIPAddrTable->dwNumEntries);
for (i=0; i < (int) pIPAddrTable->dwNumEntries; i++) {
printf("\n\tInterface Index[%d]:\t%ld\n", i, pIPAddrTable->table[i].dwIndex);
IPAddr.S_un.S_addr = (u_long) pIPAddrTable->table[i].dwAddr;
printf("\tIP Address[%d]: \t%s\n", i, inet_ntoa(IPAddr) );

IP_ADAPTER_UNICAST_ADDRESSAddress 中包含一个 SOCKET_ADDRESS,它又在 lpSockAddr 中包含一个 LPSOCKADDR - 你可以使用 WSAAddressToString 将其转换为 ipv4 字符串形式.

关于c - 从 GetAdaptersAddresses() 获取 IP_ADDRESS_STRING?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3989446/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com