connect() - IP 被阻止,如何使用主机名连接?
connect() - IP blocked, how to connect using hostname?
当我尝试连接到网络服务器时,我的 "FritzBox"(住宅网关设备)被配置为阻止所有直接连接到 IP 而不是主机名的连接。
但是,connect() 函数只允许我使用 IP 地址进行连接。
我如何使用主机名连接()到服务器(网络浏览器的方式)?
非常感谢。
首先,连接总是连接到 IP 地址,而不是主机名。所以你的网关正在做你告诉我们的事情之外的事情,它无法区分客户端如何连接到某物。它可以做的是专门检查某些协议,例如在 HTTP 请求中寻找主机:header。
但要回答你的问题:你需要用DNS查找主机名并将其转换为IP地址。这可以通过 getaddrinfo() 函数一次性完成,getaddrinfo() 将以平台特定的方式执行查找,例如查看主机文件 and/or 进行 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
... my "FritzBox" (residential gateway device) is configured to block all connections that connect directly to an IP, not a host name...
您似乎在试图绕过 Fritzbox 的 child 保护功能设置。这些设置实际上意味着它只允许在 HTTP-Request 的 Host-header 中具有真实主机名的 HTTP 连接,而不是仅包含 IP 的连接,即它将允许 http://example.com/
但不是 http://10.10.10.10/
。有关主机 header 的示例,请查看 HTTP example request at Wikipedia.
当我尝试连接到网络服务器时,我的 "FritzBox"(住宅网关设备)被配置为阻止所有直接连接到 IP 而不是主机名的连接。 但是,connect() 函数只允许我使用 IP 地址进行连接。 我如何使用主机名连接()到服务器(网络浏览器的方式)?
非常感谢。
首先,连接总是连接到 IP 地址,而不是主机名。所以你的网关正在做你告诉我们的事情之外的事情,它无法区分客户端如何连接到某物。它可以做的是专门检查某些协议,例如在 HTTP 请求中寻找主机:header。
但要回答你的问题:你需要用DNS查找主机名并将其转换为IP地址。这可以通过 getaddrinfo() 函数一次性完成,getaddrinfo() 将以平台特定的方式执行查找,例如查看主机文件 and/or 进行 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
... my "FritzBox" (residential gateway device) is configured to block all connections that connect directly to an IP, not a host name...
您似乎在试图绕过 Fritzbox 的 child 保护功能设置。这些设置实际上意味着它只允许在 HTTP-Request 的 Host-header 中具有真实主机名的 HTTP 连接,而不是仅包含 IP 的连接,即它将允许 http://example.com/
但不是 http://10.10.10.10/
。有关主机 header 的示例,请查看 HTTP example request at Wikipedia.