Прежде всего соединения всегда связаны с 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
Существует не такая вещь, как соединение, которое соединяется с именем хоста. Измените свой вопрос, чтобы описать фактическую конфигурацию. – EJP