首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >连接()- IP阻塞,如何使用主机名连接?

连接()- IP阻塞,如何使用主机名连接?
EN

Stack Overflow用户
提问于 2015-05-18 08:52:42
回答 2查看 131关注 0票数 1

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

非常感谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-18 10:25:31

..。我的"FritzBox“(住宅网关设备)被配置为阻止所有直接连接到IP的连接,而不是主机名.

看起来你在试图绕过Fritzbox的儿童保护功能的设置。这些设置实际上意味着它将只允许在HTTP请求的主机头中具有真实主机名的HTTP连接,而不允许仅包含IP的连接,即它将允许http://example.com/,而不允许http://10.10.10.10/。有关header的示例,请查看维基百科的HTTP示例请求

票数 2
EN

Stack Overflow用户

发布于 2015-05-18 09:09:51

首先,连接总是连接到IP地址,而不是主机名。所以,你的网关正在做的事情,而不是你告诉我们,它不能区分客户如何连接到某物。它可以做的是专门检查某些协议,例如在HTTP请求中查找主机:报头。

但要回答您的问题:您需要使用DNS查找主机名并将其转换为IP地址。这可以通过getaddrinfo()函数一次完成,getaddrinfo()将以特定于平台的方式执行查找,例如查看主机文件和/或进行DNS查找。

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30298799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档