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.