静的ライブラリ(どこでも使える)を使って、高速なDNSリゾルバをC++で構築しようとしています。これまでのところ、私のバージョンではgethostbyname
とが動作しないサーバーがありましたが、これは動作しません。私はA non-recoverable name server error occurred (NO_RECOVERY)
です。また、コンパイルするとき、我々はこの警告を得ている:C++の静的DNSリゾルバ
Using 'gethostbyname' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
#include <stdio.h>
#include <cstring>
// for dom
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(int argc, char *argv[])
{
char* host = "google.com";
int debugLevel = 5;
char* ip_of_domain;
struct hostent *he;
he = gethostbyname(host);
if (he == NULL)
{
switch(h_errno)
{
case HOST_NOT_FOUND:
if(debugLevel >= 3) puts("The host was not found.");
break;
case NO_ADDRESS:
if(debugLevel >= 3) puts("The name is valid but it has no address.");
break;
case NO_RECOVERY:
if(debugLevel >= 3) puts("A non-recoverable name server error occurred.");
break;
case TRY_AGAIN:
if(debugLevel >= 3) puts("The name server is temporarily unavailable.");
break;
}
}
else
{
ip_of_domain = strdup(inet_ntoa(*((struct in_addr *) he->h_addr_list[0])));
}
if(debugLevel >= 4) printf("IP=%s\n",ip_of_domain);
}
プログラムは互換性のすべての場所、32および64ビットでなければなりません。
ありがとうございました。
これはDNSリゾルバではありません。これは、OSのDNSリゾルバを使用する小さなユーティリティアプリケーションです。 OSのビルトインツールを一般的なcatch-allプログラムでラップしようとするのではなく、使用させる。警告はかなり説明されているようです。 「一部のサーバーで」とはどういう意味ですか? –
「静的ライブラリ」と「どこでも実行」は、特定のシステムコールインターフェイスにバインドするため、相互に排他的です。システムコールインターフェイスは標準化されていません。多少の変数があっても、少なくとも動的なライブラリ呼び出しレベルのインタフェースは標準です。 –
このサーバー上の@LightnessRacesinOrbit '2.6.18-371.8.1.el5#1 SMP Thu Apr 24 18:23:07 EDT 2014 i686 i686 i386 GNU/Linux 'このLinux Linuxドッカーテストでは、 4.4.0-59-ジェネリック#80-Ubuntu SMP Fri Jan 6 17:47:47 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux'それはしていません...そして、この部分は 'OSのDNSリゾルバを使います。私は別のライブラリ/関数を 'gethostbyname'の横に使う必要があると言います。それはそうだと確信しています... – DancoD