# HG changeset patch # User František Kučera # Date 1479576428 -3600 # Node ID efa6fc19b006cf5d51aece9368591b82bd0b9caa # Parent 9c0f52aa4772159072b7fa6d189a66055bc7ce90 libevent: čtení ze soketu: první část diff -r 9c0f52aa4772 -r efa6fc19b006 c++/domain-socket-bridge/domain-socket-bridge.c --- a/c++/domain-socket-bridge/domain-socket-bridge.c Fri Nov 18 23:07:02 2016 +0100 +++ b/c++/domain-socket-bridge/domain-socket-bridge.c Sat Nov 19 18:27:08 2016 +0100 @@ -2,6 +2,7 @@ #include #include #include +#include #include #include @@ -11,12 +12,14 @@ #include #include +#define MAX_LINE 16384 + static const char MESSAGE[] = "Hello, World!\n"; static const char PATH[] = "./roura"; -static void listener_cb(struct evconnlistener *, evutil_socket_t, - struct sockaddr *, int socklen, void *); +static void listener_cb(struct evconnlistener *, evutil_socket_t, struct sockaddr *, int socklen, void *); +static void conn_read_cb(struct bufferevent *, 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 *); @@ -60,7 +63,7 @@ evconnlistener_free(listener); event_free(signal_event); event_base_free(base); - + // smažeme soket na disku / soubor -- jinak by program příště spadl na evconnlistener_new_bind() unlink(PATH); @@ -72,22 +75,45 @@ 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í + //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); + bufferevent_setcb(bev, conn_read_cb, conn_write_cb, conn_event_cb, NULL); + bufferevent_setwatermark(bev, EV_READ, 0, MAX_LINE); + bufferevent_enable(bev, EV_READ | EV_WRITE); printf("někdo se k nám připojil! / %p\n", bev); bufferevent_write(bev, MESSAGE, strlen(MESSAGE)); } +static void conn_read_cb(struct bufferevent *bev, void *user_data) { + /* This callback is invoked when there is data to read on bev. */ + struct evbuffer *input = bufferevent_get_input(bev); + struct evbuffer *output = bufferevent_get_output(bev); + struct event_base *base = (event_base *) user_data; + + size_t len = evbuffer_get_length(input); + char *data; + data = (char*) malloc(len); + evbuffer_copyout(input, data, len); + + printf("we got some data: %s / %d\n", data, memcmp(data, "exit", len)); + + if (memcmp(data, "exit\n", len) == 0) { + struct timeval delay = {2, 123}; + event_base_loopexit(base, &delay); + } + + /* Copy all the data from the input buffer to the output buffer. */ + evbuffer_add_buffer(output, input); + free(data); +} + static void conn_write_cb(struct bufferevent *bev, void *user_data) { struct evbuffer *output = bufferevent_get_output(bev); if (evbuffer_get_length(output) == 0) { @@ -100,8 +126,7 @@ 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)); + printf("Got an error on the connection: %s\n", strerror(errno)); } // None of the other events can happen here, since we haven't enabled timeouts