Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets connect()-IP被阻止,如何使用主机名进行连接?_Sockets_Fritzbox - Fatal编程技术网

Sockets connect()-IP被阻止,如何使用主机名进行连接?

Sockets connect()-IP被阻止,如何使用主机名进行连接?,sockets,fritzbox,Sockets,Fritzbox,当我尝试连接到Web服务器时,我的“FritzBox”(住宅网关设备)配置为阻止所有直接连接到IP而不是主机名的连接。 但是,connect()函数只允许我使用IP地址进行连接。 如何使用主机名(web浏览器的方式)将()连接到服务器 非常感谢。首先,所有连接总是连接到IP地址,而不是主机名。因此,您的网关所做的并不是您告诉我们的,它无法区分客户端如何连接到某个对象。它可以做的是专门检查某些协议,例如在HTTP请求中查找Host:header 但要回答您的问题:您需要使用DNS查找主机名并将其转

当我尝试连接到Web服务器时,我的“FritzBox”(住宅网关设备)配置为阻止所有直接连接到IP而不是主机名的连接。 但是,connect()函数只允许我使用IP地址进行连接。 如何使用主机名(web浏览器的方式)将()连接到服务器


非常感谢。

首先,所有连接总是连接到IP地址,而不是主机名。因此,您的网关所做的并不是您告诉我们的,它无法区分客户端如何连接到某个对象。它可以做的是专门检查某些协议,例如在HTTP请求中查找Host:header

但要回答您的问题:您需要使用DNS查找主机名并将其转换为IP地址。这可以通过()函数一次完成,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
。。。我的“FritzBox”(住宅网关设备)配置为阻止所有直接连接到IP的连接,而不是主机名


看起来您正试图绕过Fritzbox的儿童保护功能的设置。这些设置实际上的意思是,它只允许HTTP请求的主机头中包含真实主机名的HTTP连接,而不允许只包含IP的连接,即它将允许
http://example.com/
但不是
http://10.10.10.10/
。有关主机头的示例,请查看。

没有连接到主机名的连接。请修改您的问题以描述实际配置。我的HTTP请求似乎拼写错误。我再也不能复制它了。我忘了在“主机:”和“www…”之间有空格。我还使用了HTTP/1.0,而不是HTTP/1.1,非常感谢。