Почему пустой IP-адрес разрешает имя компьютера как 204.204.204.204? - PullRequest
0 голосов
/ 05 октября 2018

Если я выполню команду 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 голосов
/ 05 октября 2018

Неинициализированная переменная получила это значение при отладке в VS по умолчанию.

enter image description here

0 голосов
/ 05 октября 2018

Это разрешает 204.204.204.204 из-за комбинации: (1) неинициализированной socket_address, (2) пустой ip_address и (3) конфигурации отладки [Visual Studio C ++]: -> Неинициализированный socket_address имеет простое значение (204.204.204.204 случайно из-за конфигурации Debug), -> 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, но я бы не стал рассчитывать на это значение.В Release-конфигурации без инициализации это просто мусор:

enter image description here

-

Чтобы get_computer_name правильно, используйте правильныеip_address.Второй параметр netPtonA должен содержать "Указатель на строку с нулевым символом в конце, которая содержит текстовое представление IP-адреса для преобразования в двоичную цифровую форму." [MSDN].Примерно так:

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

    get_computer_name(ip, cn);
    return 0;
}
0 голосов
/ 05 октября 2018

204 - это 0xCC, общий заполнитель для неинициализированной памяти на некоторых платформах.

Я бы не стал слишком много складывать в этом значении.Реальная проблема заключается в том, что вы не проверяете возвращаемые значения для какой-либо из этих функций API, поэтому, если они «не работают» и, следовательно, их результаты бессмысленны, вы этого не обнаружили.

Я сильно подозреваю, чтоздесь дело обстоит именно так, так что вы просто наблюдаете бессмыслицу (возможно, результат передачи полностью неинициализированного sockaddr_in в getnameinfo в отладочной сборке).

Если ошибки не возникает,функция InetPton возвращает значение 1, а буфер, указанный параметром pAddrBuf, содержит двоичный числовой IP-адрес в сетевом порядке байтов.

Функция InetPton возвращает значение 0, если параметр pAddrBuf указываетв строку, которая не является действительной точечной десятичной строкой IPv4 или действительной адресной строкой IPv6. В противном случае возвращается значение -1, и конкретный код ошибки можно получить, вызвав WSAGetLastError для расширенной информации об ошибке.

( ref )

...