编辑:在检查IPv6 Test后,我发现我的服务提供商不提供IPv6...除此之外,这段代码是很好的
对于IPv6,getaddrinfo()总是失败,错误代码为11268096,但对于IPv4,它是成功的。
设置Hint.ai_family = AF_INET6;是触发错误的原因,但我不知道为什么。
另外,如何获取数字形式的sin_port/sin6_port?我总是得到端口0。(正如@Remy Lebeau指出的那样,我只是请求域名的IP,所以它不会输出端口……)
void GetAddrInfoFromHostNameIPV6(const char* DomainName, addrinfo* Result, bool& IsSuccessful)
{
IsSuccessful = false;
addrinfo Hint;
addrinfo* Return = nullptr;
int ErrorCode;
memset(&Hint, 0, sizeof(Hint));
Hint.ai_family = AF_INET6;
Hint.ai_socktype = SOCK_STREAM;
//Hint.ai_socktype = SOCK_DGRAM;
ErrorCode = getaddrinfo(DomainName, NULL, &Hint, &Return) << '\n';
if (ErrorCode != 0)
{
std::cout << "\n Error GetAddrInfoFromHostNameIPV6() Failed with Error Code: " << ErrorCode << " in GetAddrInfoFromHostName In: NW_P!";
}
else
{
*Result = *Return;
char IpAddress[INET6_ADDRSTRLEN];
uint16_t Port;
inet_ntop(AF_INET6, &((sockaddr_in6*)((Result)->ai_addr))->sin6_addr, IpAddress, INET6_ADDRSTRLEN);
Port = *(&((sockaddr_in6*)(Result->ai_addr))->sin6_port);
std::cout << "\n IPV6 Address of Domain '" << DomainName << "' Is " << IpAddress << " With Port: " << Port;
IsSuccessful = true;
}
if (!IsSuccessful)// For the safe of readability
{
std::cout << "\n Error GetAddrInfoFromHostName() Failed in NW_P!\n";
}
}发布于 2021-07-18 02:46:17
在将错误代码分配给ErrorCode之前,您需要将错误代码左移10位。
十进制11268096是二进制101010111111000000000000。注意到右边那些多余的零了吗?
在getaddrinfo()返回后,您需要去掉<< '\n',它不属于那里,因为您没有在该行代码中将错误代码输出到std::cout。
去掉位移位,真正的错误代码是11004 (二进制10101011111100),它是WSANO_DATA
有效名称,请求的type.The请求名称的数据记录无效,并且未在数据库中找到,但没有为其解析的正确关联数据。通常的例子是使用域名服务器的主机名称到地址转换尝试(使用
gethostbyname或WSAAsyncGetHostByName)。返回MX记录,但没有A记录-指示主机本身存在,但不能直接访问。
您可以将错误代码传递给gai_strerror(),以获得错误消息输出的人类可读字符串,例如:
std::cout << "\n Error GetAddrInfoFromHostNameIPV6() Failed with Error Code: " << ErrorCode << " (" << gai_strerror(ErrorCode) << ") in GetAddrInfoFromHostName In: NW_P!";对于端口号为0,您不会要求getaddrinfo()解析任何服务名称/端口字符串作为输入( pServiceName参数为空),您只是要求将域名转换为IP,因此它不会输出任何端口号。端口号不由域本身使用。端口号由在域/IP指向的服务器上运行的服务(HTTP等)使用。
顺便说一句,您正在泄漏getaddrinfo()输出的addrinfo列表。使用完列表后,需要调用freeaddrinfo()。
https://stackoverflow.com/questions/68423037
复制相似问题