bufferevent * connect_by_host(struct event_base *base, const char * host,int port) { bufferevent * bev =NULL; do { struct evdns_base *dns_base = evdns_base_new(base, 1); char * fname = evdns_get_default_hosts_filename(); if (0!=evdns_base_load_hosts(dns_base, fname)) { printf("evdns_base_load_hosts failed! \n"); } if (fname) free(fname); bev = bufferevent_socket_new(base, -1, BEV_OPT_CLOSE_ON_FREE); if (NULL==bev) { printf("bufferevent_socket_new failed! \n"); break; } printf("++++ bufferevent_socket_new %p \n", bev); bufferevent_setcb(bev, readcb, writecb, eventcb, NULL); bufferevent_enable(bev, EV_READ|EV_WRITE); connected =0; int rt =bufferevent_socket_connect_hostname(bev, NULL, AF_INET, host, port); } while (0); return bev; }
static void test_getaddrinfo_async(void *arg) { struct basic_test_data *data = arg; struct evutil_addrinfo hints, *a; struct gai_outcome local_outcome; struct gai_outcome a_out[12]; int i; struct evdns_getaddrinfo_request *r; char buf[128]; struct evdns_server_port *port = NULL; ev_uint16_t dns_port = 0; int n_dns_questions = 0; struct evdns_base *dns_base = evdns_base_new(data->base, 0); /* for localhost */ evdns_base_load_hosts(dns_base, NULL); memset(a_out, 0, sizeof(a_out)); n_gai_results_pending = 10000; /* don't think about exiting yet. */ /* 1. Try some cases that will never hit the asynchronous resolver. */ /* 1a. Simple case with a symbolic service name */ memset(&hints, 0, sizeof(hints)); hints.ai_family = PF_UNSPEC; hints.ai_socktype = SOCK_STREAM; memset(&local_outcome, 0, sizeof(local_outcome)); r = evdns_getaddrinfo(dns_base, "1.2.3.4", "http", &hints, gai_cb, &local_outcome); tt_int_op(r,==,0); if (!local_outcome.err) { tt_ptr_op(local_outcome.ai,!=,NULL); test_ai_eq(local_outcome.ai, "1.2.3.4:80", SOCK_STREAM, IPPROTO_TCP); evutil_freeaddrinfo(local_outcome.ai); local_outcome.ai = NULL; } else {