diff -r 165fb7ff9855 -r 1fec66105b8e c++/domain-socket-bridge/domain-socket-bridge.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/c++/domain-socket-bridge/domain-socket-bridge.c Fri Nov 18 21:41:23 2016 +0100 @@ -0,0 +1,113 @@ +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +static const char MESSAGE[] = "Hello, World!\n"; + +static const int PORT = 9995; + +static void listener_cb(struct evconnlistener *, evutil_socket_t, + struct sockaddr *, int socklen, void *); +static void conn_write_cb(struct bufferevent *, void *); +static void conn_event_cb(struct bufferevent *, short, void *); +static void signal_cb(evutil_socket_t, short, void *); + +int main(int argc, char **argv) { + struct event_base *base; + struct evconnlistener *listener; + struct event *signal_event; + + struct sockaddr_in sin; + + base = event_base_new(); + if (!base) { + fprintf(stderr, "Could not initialize libevent!\n"); + return 1; + } + + memset(&sin, 0, sizeof (sin)); + sin.sin_family = AF_INET; + sin.sin_port = htons(PORT); + + listener = evconnlistener_new_bind(base, listener_cb, (void *) base, + LEV_OPT_REUSEABLE | LEV_OPT_CLOSE_ON_FREE, -1, + (struct sockaddr*) &sin, + sizeof (sin)); + + if (!listener) { + fprintf(stderr, "Could not create a listener!\n"); + return 1; + } + + signal_event = evsignal_new(base, SIGINT, signal_cb, (void *) base); + + if (!signal_event || event_add(signal_event, NULL) < 0) { + fprintf(stderr, "Could not create/add a signal event!\n"); + return 1; + } + + event_base_dispatch(base); + + evconnlistener_free(listener); + event_free(signal_event); + event_base_free(base); + + printf("done\n"); + return 0; +} + +static void listener_cb(struct evconnlistener *listener, evutil_socket_t fd, struct sockaddr *sa, int socklen, void *user_data) { + struct event_base *base = (event_base *) user_data; + struct bufferevent *bev; + + bev = bufferevent_socket_new(base, fd, BEV_OPT_CLOSE_ON_FREE); // zavírá spojení + //bev = bufferevent_socket_new(base, fd, 0); // nezavírá spojení + if (!bev) { + fprintf(stderr, "Error constructing bufferevent!"); + event_base_loopbreak(base); + return; + } + bufferevent_setcb(bev, NULL, conn_write_cb, conn_event_cb, NULL); + bufferevent_enable(bev, EV_WRITE); + bufferevent_disable(bev, EV_READ); + + printf("někdo se k nám připojil! / %p\n", bev); + + bufferevent_write(bev, MESSAGE, strlen(MESSAGE)); +} + +static void conn_write_cb(struct bufferevent *bev, void *user_data) { + struct evbuffer *output = bufferevent_get_output(bev); + if (evbuffer_get_length(output) == 0) { + printf("flushed answer / %p\n", bev); + bufferevent_free(bev); + } +} + +static void conn_event_cb(struct bufferevent *bev, short events, void *user_data) { + if (events & BEV_EVENT_EOF) { + printf("Connection closed.\n"); + } else if (events & BEV_EVENT_ERROR) { + printf("Got an error on the connection: %s\n", + strerror(errno)); /*XXX win32*/ + } + + // None of the other events can happen here, since we haven't enabled timeouts + bufferevent_free(bev); +} + +static void signal_cb(evutil_socket_t sig, short events, void *user_data) { + struct event_base *base = (event_base *) user_data; + struct timeval delay = {2, 123}; + + printf("Zachycen SIGINT (Ctrl+C); ukončuji program během %ld sekund a %ld mikrosekund.\n", delay.tv_sec, delay.tv_usec); + + event_base_loopexit(base, &delay); +}