代码之家  ›  专栏  ›  技术社区  ›  Mayur

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

  •  2
  • Mayur  · 技术社区  · 6 年前

    如果我执行命令 ping "" tracert ""
    但当我执行下面的代码时,它将计算机名解析为'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 回复  |  直到 6 年前
        1
  •  12
  •   Lightness Races in Orbit    6 年前

    0xCC

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

    我强烈怀疑这里是这样的,所以你基本上只是在观察一些无稽之谈(可能是通过一个完全没有初始化的 sockaddr_in getnameinfo 在调试版本中)。

    如果pAddrBuf参数指向的字符串不是有效的IPv4带点十进制字符串或有效的IPv6地址字符串,则InetPton函数返回值0。 WSAGetLastError获取扩展错误信息。

    ( ref )

        2
  •  4
  •   Yola    6 年前

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

    enter image description here

        3
  •  1
  •   Amit G.    6 年前

    它解析了204.204.204.204,这是因为:(1)未初始化的 socket_address ,(2)空 ip_address 和(3)调试配置[VisualStudioC++ ]: --&燃气轮机; 未初始化 套接字地址 --&燃气轮机; InetPtonA 失败(因为空 ip地址 --&燃气轮机; 套接字地址

    套接字地址

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

    &它不再解析204.204.204.204。它说204是调试配置中未初始化变量的默认值,但我不指望这个值。在没有初始化的版本配置中,它只是一个垃圾:

    enter image description here

    --

    get_computer_name netPtonA 应包含 “指向以NULL结尾的字符串的指针,该字符串包含要转换为数字二进制形式的IP地址的文本表示。” [MSDN]。类似于:

    int main()
    {
        std::string ip("127.0.0.1"), cn;
    
        get_computer_name(ip, cn);
        return 0;
    }