mercy_smile
@mercy_smile

Что в коде нужно исправить что бы мне выводился на экран ip адрес?

#pragma comment (lib,"Ws2_32.lib")
#include <winsock2.h>
#include <WS2tcpip.h>
#include <Windows.h>
#include <iostream>

int main()
{
	char domin[100];
	int status;
	struct addrinfo hints, *res, *p;
	ZeroMemory(&hints, sizeof(hints));
	hints.ai_family = AF_UNSPEC;
	hints.ai_socktype = SOCK_STREAM;

	std::cout << ("Enter domin: ");
	std::cin >> domin;

	if (status = getaddrinfo(domin, "80", &hints, &res) != 0) { 
		std::cout << ("Error: of getaddrinfo", gai_strerror(status));
		return 1;
	};

	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: ", /*ipver,*/ ipstr);
	};
	freeaddrinfo(res);
	system("pause");
	return 0;
}
  • Вопрос задан
  • 117 просмотров
Решения вопроса 1
@none7
#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;
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы