如何使用getAddrinfo_a与glibc解决异步[英] How to use getaddrinfo_a to do async resolve with glibc

本文是小编为大家收集整理的关于如何使用getAddrinfo_a与glibc解决异步的处理方法,想解了如何使用getAddrinfo_a与glibc解决异步的问题怎么解决?如何使用getAddrinfo_a与glibc解决异步问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

通常不需要外部库,但基本上没有任何文档.

推荐答案

update(2010-10-11):Linux ManPages现在拥有getAddrinfo_a的文档,您可以在这里找到它: Adam Langley的这篇文章,我将提供一些代码片段来说明其用法,并阐明一些可能首次使用的内容.使用此功能的好处是,您可以在 socket(), listing()和其他功能中轻松使用数据,如果做对了,则不必担心关于ipv4/v6.
因此,要从上面的链接开始,从基础知识开始(您需要链接到libanl(-lanl)):
这是函数原型:

int getaddrinfo_a(int mode, struct gaicb *list[], int ent, 
                  struct sigevent *);
  1. mode 是gai_wait(可能不是您想要的),而gai_nowait则用于async lookups
  2. gaicb 参数接受一系列主机来查找使用 ent 参数指定数组具有多少元素
  3. sigevent 将负责告诉我们如何通知我们的功能,稍后再详细介绍

GAICB结构看起来像这样:

struct gaicb {
    const char *ar_name;
    const char *ar_service;
    const struct addrinfo *ar_request;
    struct addrinfo *ar_result;
};

如果您熟悉getAddrinfo,那么这些字段与它们相对应:

int getaddrinfo(const char *node, const char *service,
                const struct addrinfo *hints,
                struct addrinfo **res);

节点是ar_name字段,服务是端口,提示参数对应于ar_request成员,结果存储在其余部分中.
现在,您指定了如何通过Sigevent结构通知您:

struct sigevent {
    sigval_t sigev_value;
    int sigev_signo;
    int sigev_notify;
    void (*sigev_notify_function) (sigval_t);
    pthread_addr_t *sigev_notify_attributes;
};
  1. 您可以通过设置_sigev_notify_到sigev_none
  2. 来忽略通知
  3. 您可以通过将sigev_notify设置为sigev_signal和sigev_signo触发信号.请注意,使用实时信号( sigrtmin - sigrtmax ,始终通过宏和添加 sigrtmin +2等使用它)可以沿着sigev_value中的指针或值传递.
  4. 您可以通过设置sigev_notify在新线程中请求回调

因此,基本上,如果要查找主机名,则将AR_NAME设置为主机,并将其他所有内容设置为 null ,如果要连接到主机,请设置AR_NAME和AR_SERVICE,并且如果您想要创建您指定AR_Service和AR_Result字段的服务器.您当然可以将ar_request成员自定义为您的心内容,请查看 man getAddrinfo .

如果您有select/poll/epoll/kqueue的事件循环,则可能需要使用

您当然也可以使用简单的信号处理程序来完成此工作,请查看 man sigaction 有关更多信息.

本文地址:https://www.itbaoku.cn/post/358958.html