当我尝试连接到web服务器时,我的"FritzBox"(住宅网关设备)被配置为阻止直接连接到IP的所有连接,而不是主机名。但是,connect()函数只允许我使用IP地址进行连接。如何使用主机名连接()到服务器(web浏览器的方式)?
许多谢谢。…我的"FritzBox"(住宅网关设备)被配置为阻止所有直接连接到IP的连接,而不是主机名…
看起来你试图绕过Fritzbox的儿童保护功能的设置。这些设置实际上意味着它只允许在HTTP请求的主机头中有真实主机名的HTTP连接,而不允许只包含IP的连接,即它允许http://example.com/
但不允许http://10.10.10.10/
。有关Host头的示例,请查看Wikipedia上的HTTP示例请求。
首先,连接总是连接到IP地址,而不是主机名。所以你的网关做的不是你告诉我们的,它不能分辨客户端如何连接到其他东西。它所能做的就是检查特定的协议,例如在HTTP请求中查找Host:报头。
但是要回答您的问题:您需要使用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: %sn", 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() failedn");
exit(2);
}
freeaddrinfo(servinfo);
//use clientfd