Всем привет. Есть такой пример кода:
/*
* gcc -o c-ares_test c-ares.c -static -I/usr/pkg/include -L/usr/pkg/lib -lcares_static -lm -std=c11
* gcc -o c-ares_test c-ares.c -I/usr/pkg/include -L/usr/pkg/lib -lcares -lm -std=c11
*/
#include <time.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <netdb.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <ares.h>
void dns_callback (void* arg, int status, int timeouts, struct hostent* host)
{
if(status == ARES_SUCCESS) {
//memcpy(host1, &host, sizeof(host));
printf("%s\n", host->h_name);
char ip[INET6_ADDRSTRLEN];
for (int i = 0; host->h_addr_list[i]; ++i) {
inet_ntop(host->h_addrtype, host->h_addr_list[i], ip, sizeof(ip));
printf("%s\n", ip);
}
}
else {
printf("lookup failed: %s\n", ares_strerror(status));
}
}
static void ares_loop(ares_channel channel) {
int nfds, count;
fd_set readers, writers;
struct 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) {
int status;
ares_channel channel;
status = ares_library_init(ARES_LIB_INIT_ALL);
if (status != ARES_SUCCESS){
printf("ares_library_init: %s\n", ares_strerror(status));
return 1;
}
if((status = ares_init(&channel)) != ARES_SUCCESS) {
printf("ares feiled: %s\n", ares_strerror(status));
return 1;
}
ares_gethostbyname(channel, "google.com", AF_INET6, dns_callback, NULL);
ares_gethostbyname(channel, "google.com", AF_INET, dns_callback, NULL);
ares_loop(channel);
ares_destroy(channel);
ares_library_cleanup();
return 0;
}
Как правильно вытащить результаты днс резольвинга в функцию main для дальнейшего использования в программе? Подозреваю, что нужно прокинуть указатель на структуру struct hostent* в callback функцию через void *arg, создать копию struct hostent* host, скопировать в нее данные и связать с указателем arg. Но так у меня не получилось - может не знаю как правильно, а может вообще не так надо... В общем, нужен ликбез по использованию библиотеки.