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!谢谢你。发布答案?