C ++ Разрешить IP-адрес хоста из URL - PullRequest
4 голосов
/ 28 января 2010

Как мне разрешить IP-адрес хоста, учитывая URL в Визуальный C ++?

Ответы [ 5 ]

8 голосов
/ 28 января 2010

Я не уверен, существует ли определенный класс C ++ для поиска имени хоста, но вы всегда можете прибегнуть к простому C для таких вещей. Вот моя версия, которая компилируется и работает в Linux, Mac OS X и Windows.


#include <stdio.h>

#ifdef _WIN32
#  include "winsock.h"
#else
#  include <netdb.h>
#  include <arpa/inet.h>
#endif

static void initialise(void)
{
#ifdef _WIN32
    WSADATA data;
    if (WSAStartup (MAKEWORD(1, 1), &data) != 0)
    {
        fputs ("Could not initialise Winsock.\n", stderr);
        exit (1);
    }
#endif
}

static void uninitialise (void)
{
#ifdef _WIN32
    WSACleanup ();
#endif
}

int main (int argc, char *argv[])
{
    struct hostent *he;

    if (argc == 1)
        return -1;

    initialise();

    he = gethostbyname (argv[1]);
    if (he == NULL)
    {
        switch (h_errno)
        {
            case HOST_NOT_FOUND:
                fputs ("The host was not found.\n", stderr);
                break;
            case NO_ADDRESS:
                fputs ("The name is valid but it has no address.\n", stderr);
                break;
            case NO_RECOVERY:
                fputs ("A non-recoverable name server error occurred.\n", stderr);
                break;
            case TRY_AGAIN:
                fputs ("The name server is temporarily unavailable.", stderr);
                break;
        }
    }
    else
    {
        puts (inet_ntoa (*((struct in_addr *) he->h_addr_list[0])));
    }

    uninitialise ();

    return he != NULL;
}

После компиляции укажите имя хоста в качестве аргумента:

$ ./a.out stackoverflow.com
69.59.196.211
5 голосов
/ 28 января 2010

Чтобы использовать функции сокетов под Windows, вы должны начать с вызова WSAStartup, указав нужную версию Winsock (для ваших целей 1.1 будет работать нормально). Затем вы можете позвонить gethostbyname, чтобы получить адрес хоста. Когда вы закончите, вы должны позвонить в WSACleanup. Собрав все это вместе, вы получите что-то вроде этого:

#include <windows.h>
#include <winsock.h>
#include <iostream>
#include <iterator>
#include <exception>
#include <algorithm>
#include <iomanip>

class use_WSA { 
    WSADATA d; 
    WORD ver;
public:
    use_WSA() : ver(MAKEWORD(1,1)) { 
        if ((WSAStartup(ver, &d)!=0) || (ver != d.wVersion))
            throw(std::runtime_error("Error starting Winsock"));
    }
    ~use_WSA() { WSACleanup(); }    
};

int main(int argc, char **argv) {
    if ( argc < 2 ) {
        std::cerr << "Usage: resolve <hostname>";
        return EXIT_FAILURE;
    }

    try { 
        use_WSA x;

        hostent *h = gethostbyname(argv[1]);
        unsigned char *addr = reinterpret_cast<unsigned char *>(h->h_addr_list[0]);
        std::copy(addr, addr+4, std::ostream_iterator<unsigned int>(std::cout, "."));
    }
    catch (std::exception const &exc) {
        std::cerr << exc.what() << "\n";
        return EXIT_FAILURE;
    }

    return 0;
}
0 голосов
/ 28 января 2010

Разбор URL, чтобы получить имя хоста.Затем вызовите gethostbyname или соответствующий API на вашей платформе, чтобы получить IP-адрес (а).Если вы анализируете заголовок HTTP, найдите заголовок HostName, чтобы определить имя хоста.

0 голосов
/ 28 января 2010
struct hostent *he;

if ((he = gethostbyname("localhost") == NULL) {
    // Handle error: Failed
}

IP-адрес будет в he->h_addr. Работает как на Windows, Linux и, скорее всего, MacOS.

0 голосов
/ 28 января 2010

gethostbyname * * 1002

...