C++ でドメインを非同期的に検索しようとしています。その理由は、システムがドメインを検索できない場合に備えて、タイムアウト期間を効果的に追加できるようにしたいからです。getaddrinfo_a() コマンドに出くわしたので、試してみることにしました。ただし、成功しないDNSルックアップ(インターネット接続がない場合など)をキャンセルすると、マシンで20秒以上かかることはありません。これの簡単な例を次に示します。
#include <iostream>
#include <netdb.h>
#include <string.h>
#include <unistd.h>
using namespace std;
int main() {
int ret;
gaicb* reqs;
reqs = new gaicb;
memset(reqs, 0, sizeof (gaicb));
reqs->ar_name = "google.com";
ret = getaddrinfo_a(GAI_NOWAIT, &reqs, 1, NULL);
if (ret != 0) {
cout << "something went wrong" << endl;
return false;
}
while (1) {
ret = gai_cancel(reqs);
if (ret == EAI_CANCELED || ret == EAI_ALLDONE) {
break;
}
usleep(100 * 1000); //sleep for 100 milliseconds
}
cout << "finished cancellation" << endl;
return 0;
}
次のようにコンパイルします。
g++ -o main main.cpp -lanl
次に、インターネットに接続していない Linux ベースのシステムで次のようにコマンドを実行します。
time ./main
プログラムが閉じるのに常に約 20 秒かかることがわかります。どんな助けでも大歓迎です!