Web サーバーに接続しようとすると、「FritzBox」(レジデンシャル ゲートウェイ デバイス) が、ホスト名ではなく、IP に直接接続するすべての接続をブロックするように構成されています。ただし、connect() 関数では、IP アドレスを使用してしか接続できません。ホスト名を使用してサーバーに connect() するにはどうすればよいですか (Web ブラウザーの方法)?
どうもありがとう。
...私の「FritzBox」(レジデンシャルゲートウェイデバイス)は、ホスト名ではなく、IPに直接接続するすべての接続をブロックするように構成されています...
Fritzbox の子供保護機能の設定をバイパスしようとしているようです。これらの設定が実際に意味することは、HTTP-Request の Host-header 内に実際のホスト名を持つ 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: %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