如何使用 c-ares 将 IP 解析为主机?
这就是我到目前为止所做的。它可以编译,但当我尝试运行它时会出现段错误。
#include <iostream>
#include <netdb.h>
#include <arpa/inet.h>
#include <ares.h>
void dns_callback (void* arg, int status, int timeouts, struct hostent* host)
{
std::cout << host->h_name << "\n";
}
int main(int argc, char **argv)
{
struct in_addr ip;
char *arg;
inet_aton(argv[1], &ip);
ares_channel channel;
ares_gethostbyaddr(channel, &ip, 4, AF_INET, dns_callback, arg);
sleep(15);
return 0;
}
This is what I've done so far. It compiles, but it segfaults when I try to run it.
#include <iostream>
#include <netdb.h>
#include <arpa/inet.h>
#include <ares.h>
void dns_callback (void* arg, int status, int timeouts, struct hostent* host)
{
std::cout << host->h_name << "\n";
}
int main(int argc, char **argv)
{
struct in_addr ip;
char *arg;
inet_aton(argv[1], &ip);
ares_channel channel;
ares_gethostbyaddr(channel, &ip, 4, AF_INET, dns_callback, arg);
sleep(15);
return 0;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
在使用 ares_channel 之前,您至少必须初始化,
您还需要一个事件循环来处理ares 文件描述符上的事件并调用 ares_process 来处理这些事件(更常见的是,您d 将其集成到应用程序的事件循环中)
ares 没有什么神奇之处,它不使用线程来进行异步处理,因此只需调用 sleep(15);不允许 ares 在“后台”运行
您的回调还应该检查
status
变量,如果查找失败,您将无法访问host->h_name
。一个完整的例子变成:
You atleast have to initialize the ares_channel before you use it
You also need an event loop to process events on the ares file descriptors and call ares_process to handle those events (more commonly, you'd integrate this in the event loop of your application)
There's nothing magic with ares, it doesn't use threads to do the async processing so simply calling sleep(15); doesn't let ares run in the "background"
Your callback should also inspect the
status
variable, you can't accesshost->h_name
if the lookup failed.A full example becomes: