sockaddr
sockaddr结构。该结构在
所以我们需要先检查一下
sa_family
属于
sockaddr
或
ai_family
从…起
addrinfo
(在此基础上,它必须相等)并基于此需要从
(就像这样
void*
addrinfo *addrs_out, *addr;
if (getaddrinfo("localhost", "8888", 0, &addrs_out) == NOERROR)
{
addr = addrs_out;
CHAR buf[256], *sz, srv[128];
ULONG n;
PUCHAR Byte;
do
{
union {
sockaddr* ai_addr;
SOCKADDR_IN* pa;
SOCKADDR_IN6* pa6;
};
ai_addr = addr->ai_addr;
if (addr->ai_family != ai_addr->sa_family)
{
__debugbreak();
}
switch (addr->ai_family)
{
case AF_INET6:
Byte = pa6->sin6_addr.u.Byte, n = RTL_NUMBER_OF(pa6->sin6_addr.u.Byte), sz = buf;
do
{
sz += sprintf(sz, "%02X:", *Byte++);
} while (--n);
sz[-1] = 0;
DbgPrint("AF_INET6: %s\n", buf);
break;
case AF_INET:
if (0 <= RtlIpv4AddressToStringExA(&pa->sin_addr.S_un.S_addr, pa->sin_port, buf, &(n = RTL_NUMBER_OF(buf))))
{
DbgPrint("AF_INET: %s\n", buf);
}
break;
}
if (getnameinfo(ai_addr, (socklen_t)addr->ai_addrlen, buf, RTL_NUMBER_OF(buf), srv, RTL_NUMBER_OF(srv), NI_NUMERICHOST ) == NOERROR)
{
DbgPrint("%s:%s\n", buf, srv);
}
} while (addr = addr->ai_next);
freeaddrinfo(addrs_out);
}