connect() - IP заблокирован, как подключиться, используя имя хоста?

Когда я пытаюсь подключиться к веб-серверу, мой "FritzBox" (устройство для межсетевого шлюза) настраивается на блокировку всех подключений, которые подключаются напрямую к IP, а не к имени хоста. Однако функция connect () позволяет мне подключаться только по IP-адресу. Как я могу подключиться () к серверу, используя имя хоста (как это делают веб-браузеры)?

Большое спасибо.

2 ответа

Решение

... мой "FritzBox" (устройство межсетевого шлюза) настроен на блокировку всех соединений, которые подключаются напрямую к IP, а не к имени хоста...

Похоже, вы пытаетесь обойти настройки функции защиты от детей в Fritzbox. В действительности эти настройки означают, что он разрешает только те HTTP-соединения, которые имеют настоящее имя хоста внутри заголовка Host HTTP-запроса, но не соединения, содержащие только IP, т.е. http://example.com/ но нет http://10.10.10.10/, Для примера заголовка Host посмотрите запрос HTTP в Wikipedia.

Прежде всего, соединения всегда соединяются с IP-адресом, а не с именем хоста. Таким образом, ваш шлюз делает что-то еще, кроме того, что вы нам рассказываете, он не может отличить то, как клиент подключается к чему-либо. Что он может сделать, так это проверять определенные протоколы, например, искать заголовок Host: в HTTP-запросах.

Но чтобы ответить на ваш вопрос: вам нужно найти имя хоста с помощью DNS и преобразовать его в IP-адрес. Все это можно сделать за один раз с помощью функции getaddrinfo(), getaddrinfo() выполнит поиск в зависимости от платформы, например, просмотрев файлы хоста и / или выполнив поиск DNS: например

int clientfd;  
struct addrinfo hints, *servinfo, *p;
int rc;
const char *port = "80";
const char *host = "www.google.com";

memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;

if ((rc = getaddrinfo(host, port, &hints, &servinfo)) != 0) {
    fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv));
    exit(1);
}

// getaddrinfo() can map the name to several IP addresses
for(p = servinfo; p != NULL; p = p->ai_next) {
    if ((clientfd= socket(p->ai_family, 
                  p->ai_socktype,p->ai_protocol)) == -1) {
        perror("socket()");
        continue;
    }

    if (connect(clientfd, p->ai_addr, p->ai_addrlen) == -1) {
        close(sockfd);
        continue;
    }

    break; //got a connection
}

if (p == NULL) {
    fprintf(stderr, "connect() failed\n");
    exit(2);
}

freeaddrinfo(servinfo);

//use clientfd
Другие вопросы по тегам