【发布时间】:2023-05-18 12:58:01
【问题描述】:
我正在尝试在 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 秒才能关闭。任何帮助将不胜感激!
【问题讨论】:
-
gai_cancel联机帮助页指出:“如果当前正在处理该请求,则无法取消该请求;在这种情况下,它将像从未调用过 gai_cancel() 一样处理。” -
@Andrey Akhmetov 是的,但是如果至少 20 秒内无法取消异步 dns 查询调用,那么它的意义何在?似乎根本不是异步的。或者至少违背了允许进程异步的目的。
-
不幸的是,我对这个函数和相关函数的内部没有足够的了解来告诉你为什么这可能是,只是它被记录为如此。
标签: c++ linux dns getaddrinfo getaddrinfo-a