User 13204940 Ответов: 1

Излишне сложная задача разрешения имени хоста в ip


Привет,

Мне снится кошмар, когда я делаю что-то очень простое в C++. Все, что я хочу сделать, это ввести имя хоста и получить его IP-адрес. Это не то, что должно занимать часы и часы, чтобы работать.

Независимо от того, использую ли я устаревший gethostbyname() или getaddrinfo (), ничего не работает. gethostbyname() возвращает 0.0.0.0, что явно неверно, а getaddrinfo() вообще ничего не возвращает. Я не хочу использовать устаревший код, но ни один из них не работает в любом случае.

Что я уже пробовал:

Я перепробовал так много разных вариантов одного и того же кода, что к настоящему времени их уже более 20. Самое последнее-это
struct addrinfo hints {}, *res{}, *res0{};
		
		memset(&hints, 0, sizeof(hints));
		hints.ai_family = AF_UNSPEC;
		hints.ai_socktype = SOCK_STREAM;
		getaddrinfo("www.google.com", "http", &hints, &res0);
		ip_address = res->ai_addr->sa_data;
		freeaddrinfo(res0);

1 Ответов

Рейтинг:
1

Jochen Arndt

Я бы ожидал нарушения доступа, потому что вы проходите мимо res0 но обращается res.

Если функция работает не так, как ожидалось, первое, что нужно сделать, это проверить возвращаемое значение (что должно быть сделано в любом случае) и перечитать документацию (функция getaddrinfo | Microsoft Docs[^], getaddrinfo(3) - Страница руководства Linux[^]) , который обычно содержит пример кода.


[no name]

Скорее всего, если вы свяжете меня с кодом, я его уже видел. В этом случае я уже пробовал этот код, и я не могу вспомнить результат, но это было либо 0.0.0.0, либо ничего.

Jochen Arndt

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

Пожалуйста, обратите внимание, что все, что я вижу, это то, что вы разместили. Но вы можете попробовать больше, как проверка возвращаемого значения. Если результат равен 0.0.0.0, то он должен быть ненулевым.