为什么空IP地址会将计算机名称解析为204.204.204.204?

时间:2018-10-05 11:22:04

标签: c++ winapi visual-c++ winsock

如果我执行命令ping ""tracert "",它将解析我当前的计算机名称。
但是当我执行以下代码时,它将计算机名称解析为“ 204.204.204.204”

#include <winsock2.h>
#include <ws2tcpip.h>
#include <string>
#include <iostream>

#pragma comment(lib, "Ws2_32.lib")

void get_computer_name(const std::string& ip_address, std::string& computer_name)
{
    WSADATA wsa_data;
    u_short port = 27015;
    struct sockaddr_in socket_address;
    char service_info[NI_MAXSERV] = {};
    WSAStartup(MAKEWORD(2, 2), &wsa_data);
    socket_address.sin_family = AF_INET;
    const auto error_code = InetPtonA(AF_INET, &ip_address[0], &socket_address.sin_addr.s_addr);

    socket_address.sin_port = htons(port);
    computer_name.resize(NI_MAXHOST);
    getnameinfo((struct sockaddr *) &socket_address,
            sizeof(socket_address),
            &computer_name[0],
            NI_MAXHOST, service_info, NI_MAXSERV, NI_NUMERICSERV);
    WSACleanup();
}

int main(int argc, wchar_t **argv)
{
    std::string computer_name;
    get_computer_name("", computer_name);
    std::cout << computer_name << std::endl;
    return 0;
}

我很好奇204.204.204.204为什么?

3 个答案:

答案 0 :(得分:11)

204是0xCC,它是某些平台上未初始化内存的常用占位符。

我不会在这个价值上投入太多股票。真正的问题是您没有检查任何这些API函数的返回值,因此,如果它们“失败”,并且它们的结果因此没有意义,则您不会检测到。

我强烈怀疑这里就是这种情况,因此您基本上只是在观察废话(可能是在调试版本中将完全未初始化的sockaddr_in传递给getnameinfo的结果)。

  

如果未发生错误,则InetPton函数将返回值1,并且pAddrBuf参数指向的缓冲区将包含网络字节顺序的二进制数字IP地址。

     

如果pAddrBuf参数指向的字符串不是有效的IPv4点分十进制字符串或有效的IPv6地址字符串,则InetPton函数将返回值为0。否则,值为-1返回,并且可以通过调用   WSAGetLastError以获取扩展的错误信息。

     

ref

答案 1 :(得分:4)

默认情况下,未初始化的变量在VS中的调试中具有此值。

enter image description here

答案 2 :(得分:1)

它解析为204.204.204.204,原因是:(1)未初始化的socket_address,(2)空的ip_address和(3)调试配置[Visual Studio C ++]:< strong>-> 未初始化的socket_address仅具有一个值(由于进行了Debug-configuration,偶然发生了204.204.204.204),-> InetPtonA失败了(因为的ip_address为空,因此-> socket_address不变。

socket_address初始化为0:

struct sockaddr_in socket_address; memset(&socket_address, 0, sizeof(sockaddr_in));

&不再解析204.204.204.204。它说204是Debug配置中未初始化变量的默认值,但我不会指望该值。在没有初始化的发布配置中,这简直是垃圾:

enter image description here

-

要正确使用get_computer_name,请正确使用ip_addressnetPtonA的第二个参数应包含“指向以NULL结尾的字符串的指针,该字符串包含要转换为数字二进制形式的IP地址的文本表示。” 。像这样:

int main()
{
    std::string ip("127.0.0.1"), cn;

    get_computer_name(ip, cn);
    return 0;
}
相关问题