Я пытаюсь найти домен асинхронно в 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 секунд. Любая помощь будет принята с благодарностью!