Windows 如何从SOCKADDR结构获取IPv4地址?

Windows 如何从SOCKADDR结构获取IPv4地址?,windows,winapi,winsock,winsock2,Windows,Winapi,Winsock,Winsock2,我不知道如何从结构的address字段中获取实际的IPV4地址(例如192.168.1.1或其相应的压缩形式为32位整数)。我进入了链接列表和相应的MSDN链接的兔子洞,但是SOCKADDR就是它被切断的地方SOCKADDR是通用数据持有者,必须将其转换为IPv4变体才能获得数据的结构化视图 问题是,我找不到哪个结构是SOCKADDR的IPv4映射。已在\u addr中尝试,获取垃圾值 auto pAddresses = static_cast<IP_ADAPTER_ADDRESSES*&

我不知道如何从结构的
address
字段中获取实际的IPV4地址(例如192.168.1.1或其相应的压缩形式为32位整数)。我进入了链接列表和相应的MSDN链接的兔子洞,但是
SOCKADDR
就是它被切断的地方
SOCKADDR
是通用数据持有者,必须将其转换为IPv4变体才能获得数据的结构化视图

问题是,我找不到哪个结构是
SOCKADDR
的IPv4映射。已在\u 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);
                                                     ^^^^????
            }
        }
    }
auto paddress=static_cast(malloc(defaultBufferSize));
ULONG Exputflen=默认缓冲区大小;
constexpr ULONG flags=GAA_FLAG_SKIP_ANYCAST | GAA_FLAG_SKIP_MULTICAST | GAA_FLAG_SKIP_DNS_SERVER | GAA_FLAG_SKIP_友好名称;
自动结果=GetAdapterAddresses(AF_INET/*仅IP v4,因为还没有摄像头使用v6*/、标志、空PTR、软垫和外挂);
uint32_t ipV4Address=0;
//迭代返回的适配器信息结构
用于(自动currentInterfaceInfo=Paddress;currentInterfaceInfo!=nullptr;currentInterfaceInfo=currentInterfaceInfo->Next)
{
if(currentInterfaceInfo->IfType!=if_TYPE_IEEE80211 | | currentInterfaceInfo->IPV4已启用!=1 | | currentInterfaceInfo->ReceiveOnly!=0)
持续
如果(currentInterfaceInfo->FirstUnicastAddress)
{
对于(自动地址信息=currentInterfaceInfo->FirstUnicastAddress;地址信息!=nullptr;地址信息=currentInterfaceInfo->FirstUnicastAddress->Next)
{
如果(!addressInfo->Address.lpSockaddr | | addressInfo->Address.lpSockaddr->sa_family!=AF_INET/*IP v4*/)
持续
auto ipv4AddrInfo=重新解释强制转换(addressInfo->Address.lpSockaddr);
^^^^????
}
}
}

给定一个
SOCKADDR*
,查看其
sau系列
字段以确定地址类型

  • 对于
    AF\u INET
    地址,键入
    SOCKADDR*
    SOCKADDR\u IN*
    ,然后您可以访问其
    sin\u addr
    字段

  • 对于
    AF\u INET6
    地址,将
    SOCKADDR*
    键入
    SOCKADDR\u IN6*
    ,然后您可以访问其
    sin6\u addr
    字段

std::向量缓冲区(defaultBufferSize);
auto paddress=reinterpret_cast(buffer.data());
ULONG Exputflen=默认缓冲区大小;
constexpr ULONG flags=GAA_FLAG_SKIP_ANYCAST | GAA_FLAG_SKIP_MULTICAST | GAA_FLAG_SKIP_DNS_SERVER | GAA_FLAG_SKIP_友好名称;
自动结果=GetAdapterAddresses(AF_INET/*仅IP v4,因为还没有摄像头使用v6*/、标志、空PTR、软垫和外挂);
uint32_t ipV4Address=0;
//迭代返回的适配器信息结构
用于(自动currentInterfaceInfo=Paddress;currentInterfaceInfo!=nullptr;currentInterfaceInfo=currentInterfaceInfo->Next)
{
if(currentInterfaceInfo->IfType!=if_TYPE_IEEE80211 | | currentInterfaceInfo->IPV4已启用!=1 | | currentInterfaceInfo->ReceiveOnly!=0)
持续
对于(自动地址信息=currentInterfaceInfo->FirstUnicastAddress;地址信息!=nullptr;地址信息=addressInfo->Next)
{
如果(!addressInfo->Address.lpSockaddr | | addressInfo->Address.lpSockaddr->sa_family!=AF_INET/*IP v4*/)
持续
auto ipv4AddrInfo=重新解释强制转换(addressInfo->Address.lpSockaddr);
//根据需要使用ipv4AddrInfo->sin\u addr。。。
}
}

这是
中的SOCKADDR\u
@RbMm:Bingo!谢谢你。发布答案?