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