2

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 秒かかることがわかります。どんな助けでも大歓迎です!

4

1 に答える 1