in tensorflow_serving/util/net_http/socket/testing/ev_print_req_server.cc [160:241]
int main(int argc, char **argv) {
fprintf(stdout, "Start the http server ...\n");
struct event_base *base;
struct evhttp *http;
struct evhttp_bound_socket *handle;
ev_uint32_t port = 8080;
if (argc < 2) {
help();
return 1;
}
bool port_parsed = absl::SimpleAtoi(argv[1], &port);
if (!port_parsed) {
fprintf(stderr, "Invalid port: %s\n", argv[1]);
}
base = event_base_new();
if (!base) {
fprintf(stderr, "Couldn't create an event_base: exiting\n");
return 1;
}
http = evhttp_new(base);
if (!http) {
fprintf(stderr, "couldn't create evhttp. Exiting.\n");
return 1;
}
// catch all
evhttp_set_gencb(http, request_cb, NULL);
// nullptr will bind to ipv4, which will fail to accept
// requests from clients where getaddressinfo() defaults to AF_INET6
handle = evhttp_bind_socket_with_handle(http, "::0", (ev_uint16_t)port);
if (!handle) {
fprintf(stderr, "couldn't bind to port %d. Exiting.\n", (int)port);
return 1;
}
{
/* Extract and display the address we're listening on. */
struct sockaddr_storage ss = {};
evutil_socket_t fd;
ev_socklen_t socklen = sizeof(ss);
char addrbuf[128];
void *inaddr;
const char *addr;
int got_port = -1;
fd = evhttp_bound_socket_get_fd(handle);
memset(&ss, 0, sizeof(ss));
if (getsockname(fd, (struct sockaddr *)&ss, &socklen)) {
perror("getsockname() failed");
return 1;
}
if (ss.ss_family == AF_INET) {
got_port = ntohs(((struct sockaddr_in *)&ss)->sin_port);
inaddr = &((struct sockaddr_in *)&ss)->sin_addr;
} else if (ss.ss_family == AF_INET6) {
got_port = ntohs(((struct sockaddr_in6 *)&ss)->sin6_port);
inaddr = &((struct sockaddr_in6 *)&ss)->sin6_addr;
} else {
fprintf(stderr, "Weird address family %d\n", ss.ss_family);
return 1;
}
addr = evutil_inet_ntop(ss.ss_family, inaddr, addrbuf, sizeof(addrbuf));
if (addr) {
printf("Listening on %s:%d\n", addr, got_port);
evutil_snprintf(uri_root, sizeof(uri_root), "http://%s:%d", addr,
got_port);
} else {
fprintf(stderr, "evutil_inet_ntop failed\n");
return 1;
}
}
event_base_dispatch(base);
return 0;
}