Oops, please skip this message, now I found the demo ahost.c and it seems
exactly I'm looking for.

sorry, I'm very newbie in libcares, I just discovered this library today!
^^'

On Mon, Nov 7, 2016 at 5:03 PM, silvioprog <silviop...@gmail.com> wrote:

> Hello list, this is my first post here. :-)
>
> So, I've tried to use c-ares on Windows 10 in a simple DNS lookup,
> however, I can't understand why it does not work. Consider the following
> code (found by googling, unfortunately I can't find any c-ares official
> example or any "get started" :-/ ):
>
> #include <ares.h>
> #include <stdio.h>
>
> static void state_cb(void *data, int s, int read, int write) {
>     printf("Change state fd %d read:%d write:%d\n", s, read, write);
> }
>
> static void callback(void *arg, int status, int timeouts, struct hostent
> *host) {
>     if (!host || status != ARES_SUCCESS) {
>         printf("Failed to lookup %s\n", ares_strerror(status));
>         return;
>     }
>     printf("Found address name %s\n", host->h_name);
>     char ip[INET6_ADDRSTRLEN];
>     int i = 0;
>     for (i = 0; host->h_addr_list[i]; ++i) {
>         ares_inet_ntop(host->h_addrtype, host->h_addr_list[i], ip,
> sizeof(ip));
>         printf("%s\n", ip);
>     }
> }
>
> static void wait_ares(ares_channel channel) {
>     for (;;) {
>         struct timeval *tvp, tv;
>         fd_set read_fds, write_fds;
>         int nfds;
>         FD_ZERO(&read_fds);
>         FD_ZERO(&write_fds);
>         nfds = ares_fds(channel, &read_fds, &write_fds);
>         if (nfds == 0) {
>             break;
>         }
>         tvp = ares_timeout(channel, NULL, &tv);
>         select(nfds, &read_fds, &write_fds, NULL, tvp);
>         ares_process(channel, &read_fds, &write_fds);
>     }
> }
>
> int main() {
>     ares_channel channel = NULL;
>     int status;
>     struct ares_options options = {0};
>     int optmask = 0;how to fix this problem?
>
>     status = ares_library_init(ARES_LIB_INIT_ALL);
>     if (status != ARES_SUCCESS) {
>         printf("ares_library_init: %s\n", ares_strerror(status));
>         return 1;
>     }
>
>     //options.sock_state_cb_data = state_cb;
>     options.sock_state_cb = (ares_sock_state_cb) state_cb;
>
>     optmask |= ARES_OPT_SOCK_STATE_CB;
>
>     status = ares_init_options(&channel, &options, optmask);
>
>     if (status != ARES_SUCCESS) {
>         printf("ares_init_options: %s\n", ares_strerror(status));
>         return 1;
>     }
>
>     ares_gethostbyname(channel, "www.google.com.br", AF_INET, callback,
> NULL);
>     //ares_gethostbyname(channel, "google.com", AF_INET6, callback, NULL);
>     wait_ares(channel);
>     ares_destroy(channel);
>     ares_library_cleanup();
>     return 0;
> }
>
> This same example works fine on Ubuntu, but on Windows it always returns
> "ares_init_options: Misformatted domain name". :-(
>
> So, what I'm doing wrong?
>
> My environment:
>
> Project compiled for win 32 bits
> Windows 10
> MinGW w64
> c-ares-1.12.0 (tried c-ares-1.10.0 too, same problem)
> Dlls in the app folder: libcares-2.dll, libgcc_s_dw2-1.dll
> and libwinpthread-1.dll
>

-- 
Silvio Clécio

Reply via email to