#pragma comment (lib,"Ws2_32.lib")
#include <winsock2.h>
#include <WS2tcpip.h>
#include <Windows.h>
#include <iostream>
#include <string>
int main() {
WSADATA wsa;
std::string domain;
int status;
struct addrinfo hints = { 0 }, * res, * p;
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
// ошибки выводятся в ANSI кодировке, а консоль по умолчанию в OEM
SetConsoleCP(GetACP());
SetConsoleOutputCP(GetACP());
// На Windows необходима инициализация сетевой библиотеки
if (status = WSAStartup(MAKEWORD(2, 2), &wsa) != 0) {
std::cout << "Error: of getaddrinfo: " << get_error_message(status) << std::endl;
// принято возвращать причину ошибки, а не только сам факт
return status;
}
std::cout << ("Enter domain: ");
// даже доменные имена могут иметь длину 256 символов
// пользователь же может вообще ввести сколько ему угодно
std::getline(std::cin, domain);
if (status = getaddrinfo(domain.c_str(), "80", &hints, &res) != 0) {
std::cout << "Error: of getaddrinfo: " << get_error_message(status) << std::endl;
return status;
};
char ipstr[INET6_ADDRSTRLEN];
for (p = res; p != NULL; p = p->ai_next) {
/*const char* ipver;*/
void* addr;
if (p->ai_family == AF_INET) {
struct sockaddr_in* ipv4 = (struct sockaddr_in*)p->ai_addr;
addr = &(ipv4->sin_addr);
/*ipver = "IPv4:";*/
}
else {
struct sockaddr_in6* ipv6 = (struct sockaddr_in6*)p->ai_addr;
addr = &(ipv6->sin6_addr);
/*ipver = "IPv6:";*/
}
inet_ntop(p->ai_family, addr, ipstr, sizeof(ipstr));
std::cout << "addres: " << ipstr << std::endl;
};
freeaddrinfo(res);
system("pause");
// деструктор сетевой библиотеки
WSACleanup();
return 0;
}