struct evdns_server_port * regress_get_dnsserver(struct event_base *base, ev_uint16_t *portnum, evutil_socket_t *psock, evdns_request_callback_fn_type cb, void *arg) { struct evdns_server_port *port = NULL; evutil_socket_t sock; struct sockaddr_in my_addr; sock = socket(AF_INET, SOCK_DGRAM, 0); if (sock <= 0) { tt_abort_perror("socket"); } evutil_make_socket_nonblocking(sock); memset(&my_addr, 0, sizeof(my_addr)); my_addr.sin_family = AF_INET; my_addr.sin_port = htons(*portnum); my_addr.sin_addr.s_addr = htonl(0x7f000001UL); if (bind(sock, (struct sockaddr*)&my_addr, sizeof(my_addr)) < 0) { tt_abort_perror("bind"); } port = evdns_add_server_port_with_base(base, sock, 0, cb, arg); if (!*portnum) *portnum = regress_get_socket_port(sock); if (psock) *psock = sock; return port; end: return NULL; }
bool f4dns_init(f4dns_ctx_t *ctx) { ctx->dns_base = evdns_base_new( ctx->f4->base, 1 ); assert( ctx->dns_base != NULL ); ctx->sock = socket(ctx->f4->listen_dns.ss_family, SOCK_DGRAM, 0); evutil_make_socket_nonblocking(ctx->sock); if( bind(ctx->sock, (struct sockaddr*)&ctx->f4->listen_dns, ctx->f4->listen_dns_sz) != 0 ) { perror("Cannot bind() DNS socket"); return false; } ctx->server = evdns_add_server_port_with_base(ctx->f4->base, ctx->sock, 0, _f4dns_cb_dnsserver, ctx); return true; }
void proxyService() { struct event_base *event_base = NULL; //struct evdns_base *evdns_base = NULL; event_base = event_base_new(); //evdns_base = evdns_base_new(event_base, 0); evutil_socket_t sock; struct sockaddr_in my_addr; sock = socket(PF_INET, SOCK_DGRAM, 0); if(sock == -1) { printf("socket create error\n"); return; } evutil_make_socket_nonblocking(sock); my_addr.sin_family = AF_INET; my_addr.sin_port = htons(53); my_addr.sin_addr.s_addr = INADDR_ANY; if(bind(sock, (struct sockaddr*)&my_addr, sizeof(my_addr))<0) { printf("bind error\n"); return; } evdns_add_server_port_with_base(event_base, sock, 0, evdns_server_callback, NULL); event_base_dispatch(event_base); }