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