2015-05-18 4 views
1

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

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

+0

Существует не такая вещь, как соединение, которое соединяется с именем хоста. Измените свой вопрос, чтобы описать фактическую конфигурацию. – EJP

ответ

2

... мой «Fritzbox» (жилой шлюз) выполнен с возможностью блокировать все соединения, которые подключаются непосредственно к IP, а не имя хоста ...

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

+0

Кажется, мой запрос HTTP был опечатан. Я больше не могу воспроизвести его. Я забыл пробел между «Host:» и «www ...». Также я использовал HTTP/1.0, а не HTTP/1.1 Большое спасибо. – KungPhoo

1

Прежде всего соединения всегда связаны с 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