【发布时间】:2019-07-21 13:54:42
【问题描述】:
我不知道如何从IP_ADAPTER_UNICAST_ADDRESS_LH 结构的Address 字段中获取实际的 IP v4 地址(例如 192.168.1.1 或其对应的 32 位整数打包形式)。我去了链接列表和相应的 MSDN 链接的兔子洞,但 SOCKADDR 是它切断的地方。 SOCKADDR 是通用数据持有者,它必须转换为 IPv4 变体才能获得数据的结构化视图。
问题是,我找不到 SOCKADDR 的 IPv4 映射结构。试过in_addr,得到垃圾值。
auto pAddresses = static_cast<IP_ADAPTER_ADDRESSES*>(malloc(defaultBufferSize));
ULONG outBufLen = defaultBufferSize;
constexpr ULONG flags = GAA_FLAG_SKIP_ANYCAST | GAA_FLAG_SKIP_MULTICAST | GAA_FLAG_SKIP_DNS_SERVER | GAA_FLAG_SKIP_FRIENDLY_NAME;
auto result = GetAdaptersAddresses(AF_INET /* Only IP v4 since no cameras use v6 yet */, flags, nullptr, pAddresses, &outBufLen);
uint32_t ipV4Address = 0;
// Iterating over the returned adapter info structures
for (auto currentInterfaceInfo = pAddresses; currentInterfaceInfo != nullptr; currentInterfaceInfo = currentInterfaceInfo->Next)
{
if (currentInterfaceInfo->IfType != IF_TYPE_IEEE80211 || currentInterfaceInfo->Ipv4Enabled != 1 || currentInterfaceInfo->ReceiveOnly != 0)
continue;
if (currentInterfaceInfo->FirstUnicastAddress)
{
for (auto addressInfo = currentInterfaceInfo->FirstUnicastAddress; addressInfo != nullptr; addressInfo = currentInterfaceInfo->FirstUnicastAddress->Next)
{
if (!addressInfo->Address.lpSockaddr || addressInfo->Address.lpSockaddr->sa_family != AF_INET /* IP v4 */)
continue;
auto ipv4AddrInfo = reinterpret_cast<in_addr*>(addressInfo->Address.lpSockaddr);
^^^^????
}
}
}
【问题讨论】:
-
这是
SOCKADDR_IN -
@RbMm:宾果游戏!谢谢你。发布答案?
标签: windows winapi winsock winsock2