如何使用 c-ares 将 IP 解析为主机?

2023-11-21

这就是我到目前为止所做的。它可以编译,但当我尝试运行它时会出现段错误。

#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;
  }

你至少必须初始化使用之前的 ares_channel

 if(ares_init(&channel) != ARES_SUCCESS) {
   //handle error
  }

您还需要一个事件循环来处理 ares 文件描述符上的事件并调用战神进程处理这些事件(更常见的是,您可以将其集成到应用程序的事件循环中) ares 没有什么神奇之处,它不使用线程来进行异步处理,因此只需调用 sleep(15);不让 ares 在“后台”运行

您的回调还应该检查status变量,您无法访问host->h_name如果查找失败。

一个完整的例子变成:

#include <time.h>
#include <iostream>
#include <netdb.h>
#include <arpa/inet.h>
#include <ares.h>

void dns_callback (void* arg, int status, int timeouts, struct hostent* host)
{
    if(status == ARES_SUCCESS)
        std::cout << host->h_name << "\n";
    else
        std::cout << "lookup failed: " << status << '\n';
}
void main_loop(ares_channel &channel)
{
    int nfds, count;
    fd_set readers, writers;
    timeval tv, *tvp;
    while (1) {
        FD_ZERO(&readers);
        FD_ZERO(&writers);
        nfds = ares_fds(channel, &readers, &writers);
        if (nfds == 0)
          break;
        tvp = ares_timeout(channel, NULL, &tv);
        count = select(nfds, &readers, &writers, NULL, tvp);
        ares_process(channel, &readers, &writers);
     }

}
int main(int argc, char **argv)
{
    struct in_addr ip;
    int res;
    if(argc < 2 ) {
        std::cout << "usage: " << argv[0] << " ip.address\n";
        return 1;
    }
    inet_aton(argv[1], &ip);
    ares_channel channel;
    if((res = ares_init(&channel)) != ARES_SUCCESS) {
        std::cout << "ares feiled: " << res << '\n';
        return 1;
    }
    ares_gethostbyaddr(channel, &ip, sizeof ip, AF_INET, dns_callback, NULL);
    main_loop(channel);
    return 0;
  }


 $ g++ -Wall test_ares.cpp  -lcares
 $ ./a.out 8.8.8.8
google-public-dns-a.google.com
  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 c-ares 将 IP 解析为主机? 的相关文章

随机推荐

  • 使用 jpackage 实用程序进行代码签名+公证在 macOS 上不起作用

    对于某些上下文 我使用 jpackage 实用程序尝试创建签名的 DMG 文件以交付给我的用户 我需要签署此 DMG 的原因是我想对该软件进行公证 顺便说一句 我不确定是否可以使用 jpackage 进行公证 但无论如何我正在尝试 但是 我
  • 通过弱指针对块中的 ivar 进行赋值

    我有一个只读属性isFinished在我的界面文件中 typedef void MyFinishedBlock BOOL success NSError e interface TMSyncBase NSObject BOOL isFini
  • UISearchbar 的“取消”按钮的图像[重复]

    这个问题在这里已经有答案了 可能的重复 设置 UISearchBar 中取消按钮的样式 我正在尝试为搜索栏设置图像 我可以使用搜索栏的子视图为搜索栏设置图像UISearchBarBackground 但我无法为搜索栏的取消按钮设置图像 我得
  • 由 IIS 提供服务时,Fontawesome 无法工作

    当我将应用程序放在 IIS7 服务器上时 FontAwesome 对我不起作用 在 Firefox 中 请求的 URL 被编码为http l2etest kema intra fonts fontawesome webfont ttf 3F
  • Spring RESTTemplate 的泛型

    我有一堂这样的课 public class Wrapper
  • Python Pandas 复制数据框中的行

    如果数据框看起来像 Store Dept Date Weekly Sales IsHoliday 1 1 2010 02 05 24924 5 FALSE 1 1 2010 02 12 46039 49 TRUE 1 1 2010 02 1
  • 使用 SafeNet eToken 自动进行扩展验证 (EV) 代码签名

    我们最近购买了 DigiCert EV 代码签名证书 我们可以使用signtool exe 对 exe 文件进行签名 但是 每次我们签署文件时 它都会提示输入 SafeNet eToken 密码 我们如何通过在某处存储 缓存密码来自动化此过
  • Android中位图压缩后如何保存Exif数据

    按照相机意图拍摄照片后 我压缩位图以减小文件大小 问题是压缩后 它会丢失所有 EXIF 数据 我检索原始 EXIF 数据没有问题 但是 如何在压缩后将此 EXIFF 数据添加到字节数组中 我的猜测是采用字节数组并创建它的位图 然后添加旧的
  • jQuery 1.9.0 破坏 $.attrFn 对象

    我编写了一个有用的 移动 事件库 可以在这里找到 它本质上统一了触摸事件 以便单个事件可以绑定到一个元素 并且无论用户的设备 即移动设备或桌面设备 如何 它都会触发 代码一直运行良好 但是在调试用户的问题时 我注意到使用 jQuery 1
  • ShadowRoot.getSelection()?

    我有一个丰富的编辑器 我正在将其重写为 lit element 自定义元素 我使用 Firefox 最新 进行测试 我试图在自定义元素的 ShadowDom 中选择内容可编辑元素 在方法中 在 Firefox 调试器中 this shado
  • 如何使用 Python 将换行符写入 csv 中“\n”?

    我需要重新定义以下代码 以便行数据中的任何换行符 将显示为空行 显示为 n 书面文件中 然而 n 需要在每行之后写入以显示为空行 显然 每一行都需要编码为 utf 8 以避免错误 with open csvfile csv w as csv
  • C# 序列化和反序列化json到txt文件

    我在用着牛顿软件用于在我的 wpf 应用程序中处理 json 我有一个可以保存到txt 文件的客户 不涉及数据库 我这样做是这样的 public int store string reservation JObject customer n
  • 为什么我们使用数组而不是其他数据结构?

    在我编程时 我还没有看到数组比其他形式更适合存储信息的实例 我确实认为编程语言中添加的 功能 已经对此进行了改进 并由此取代了它们 我现在发现它们并没有被取代 而是被赋予了新的生命 可以这么说 那么 基本上 使用数组有什么意义呢 这并不是说
  • C++ 中宏相对于内联的优势

    我们知道内联是有利的 因为它们由编译器检查 并且与宏相比 作为参数传递时相同的操作 如 x 不会计算多次 但在一次采访中 有人问我在 C 中宏更适合内联的具体优点或情况 有谁知道答案或者可以思考这个问题 我唯一能想到的是 您可以使用宏来完成
  • 获取 iPhone 的物理屏幕尺寸(以英寸为单位)

    如何以编程方式获取以英寸为单位的屏幕尺寸 例如 iPhone 4 3 5 英寸 我找到了一种通过检测 iPhone iPad 型号来做到这一点的方法 但硬编码不是我想要的 所以我不看这样的东西 Swift 4 屏幕版本 let scale
  • mongodb c# API V2:ReplaceOne 和 FindOneAndReplace 之间的区别

    查看 mongodb 文档 我读到 FindOneAndReplace 将是一个原子操作 但我不明白的是为什么 ReplaceOne 不是原子的 如果存在差异 为什么还要使用 ReplaceOne 该文档揭示了一个不同的方法签名 替换一个
  • 读取文件直到Python中的特定字符

    我目前正在开发一个应用程序 该应用程序需要从文件中读取所有输入 直到遇到某个字符 通过使用代码 file open Questions txt r c file readlines c x strip for x in c 每次脱衣相遇 n
  • 从不同的基类重载同名的虚函数。是否可以? [复制]

    这个问题在这里已经有答案了 标题可能令人困惑 假设我们有以下设置 class A public virtual void fn 0 class B public virtual int fn class C public A public
  • R 创建包含每行最大值的列名的列

    我和这个问题有同样的要求 对于每一行返回最大值的列名 但是 我需要包含每行最大值的所有列的名称 如果我每行有两个相同的最大值 上面链接中提供的所有解决方案都会出现问题 df lt data frame V1 c 2 8 1 5 6 V2 c
  • 如何使用 c-ares 将 IP 解析为主机?

    这就是我到目前为止所做的 它可以编译 但当我尝试运行它时会出现段错误 include