Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <event2/listener.h>
- #include <event2/bufferevent.h>
- #include <event2/buffer.h>
- #include <event2/thread.h>
- #include <arpa/inet.h>
- #include <string.h>
- #include <stdlib.h>
- #include <stdio.h>
- #include <errno.h>
- #include <unistd.h>
- #include <pthread.h>
- /* g++ Test_libevent.cpp -o Test_libevent -levent_core -levent_pthreads && ./Test_libevent */
- static void
- echo_read_cb(struct bufferevent *bev, void *ctx)
- {
- struct evbuffer *input = bufferevent_get_input(bev);
- struct evbuffer *output = bufferevent_get_output(bev);
- evbuffer_add_buffer(output, input);
- }
- static void
- echo_event_cb(struct bufferevent *bev, short events, void *ctx)
- {
- fprintf( stderr, "An event from one of the clients...\n" );
- if (events & BEV_EVENT_ERROR)
- perror("Error from bufferevent");
- if (events & (BEV_EVENT_EOF | BEV_EVENT_ERROR)) {
- bufferevent_free(bev);
- }
- }
- static void
- client_event_cb(struct bufferevent *bev, short events, void *ctx)
- {
- if (events & BEV_EVENT_ERROR)
- perror("Error from bufferevent");
- if (events & (BEV_EVENT_EOF | BEV_EVENT_ERROR)) {
- bufferevent_free(bev);
- }
- }
- static void
- accept_conn_cb(struct evconnlistener *listener,
- evutil_socket_t fd, struct sockaddr *address, int socklen,
- void *ctx)
- {
- struct event_base *base = evconnlistener_get_base(listener);
- struct bufferevent *bev = bufferevent_socket_new(
- base, fd, BEV_OPT_CLOSE_ON_FREE);
- bufferevent_setcb(bev, echo_read_cb, NULL, echo_event_cb, NULL);
- bufferevent_enable(bev, EV_READ|EV_WRITE);
- }
- static void
- client_incoming_socket_cb( struct bufferevent *bev, void *ctx )
- {
- char recv_msg[256];
- memset(recv_msg, 0, 256);
- bufferevent_read( bev, recv_msg, sizeof(recv_msg));
- fprintf( stderr, "Incoming message from Server to Client = '%s'\n", recv_msg );
- fprintf( stderr, "Simulating Client CUTOFF\n" );
- struct event_base *base = (struct event_base*) ctx;
- event_base_loopexit( base, NULL );
- }
- static void
- accept_error_cb(struct evconnlistener *listener, void *ctx)
- {
- struct event_base *base = evconnlistener_get_base(listener);
- int err = EVUTIL_SOCKET_ERROR();
- fprintf(stderr, "Got an error %d (%s) on the listener. "
- "Shutting down.\n", err, evutil_socket_error_to_string(err));
- event_base_loopexit(base, NULL);
- }
- static void* startServer( void* userData )
- {
- struct event_base *base;
- struct evconnlistener *listener;
- struct sockaddr_in sin;
- int port = 7777;
- base = event_base_new();
- if (!base) {
- puts("Couldn't open event base");
- return NULL;
- }
- memset(&sin, 0, sizeof(sin));
- sin.sin_family = AF_INET;
- sin.sin_addr.s_addr = htonl(0);
- sin.sin_port = htons(port);
- listener = evconnlistener_new_bind(base, accept_conn_cb, NULL,
- LEV_OPT_CLOSE_ON_FREE|LEV_OPT_REUSEABLE, -1,
- (struct sockaddr*)&sin, sizeof(sin));
- if (!listener) {
- perror("Couldn't create listener");
- return NULL;
- }
- evconnlistener_set_error_cb(listener, accept_error_cb);
- event_base_dispatch(base);
- return NULL;
- }
- static void* startClient( void* userData )
- {
- int port = 7777;
- struct sockaddr_in sin;
- int sockfd;
- bzero( &sin, sizeof( sin ));
- sin.sin_family = AF_INET;
- sin.sin_addr.s_addr = inet_addr( "127.0.0.1" );
- sin.sin_port = htons( port );
- if ( (sockfd=socket( PF_INET, SOCK_STREAM, IPPROTO_TCP )) < 0 ) // AF_INET also seems to work
- {
- perror( "socket() failed: " );
- exit( -1 );
- }
- if ( (connect( sockfd, (struct sockaddr *) &sin, sizeof(sin))) < 0 )
- {
- perror( "connect() failed: " );
- exit( -1 );
- }
- struct event_base* base = event_base_new();
- struct bufferevent* bev = bufferevent_socket_new( base, sockfd, BEV_OPT_CLOSE_ON_FREE|BEV_OPT_THREADSAFE );
- bufferevent_enable( bev, EV_READ|EV_WRITE );
- bufferevent_setcb( bev, client_incoming_socket_cb, NULL, client_event_cb, base );
- const char* str = "Hello World!";
- evbuffer_add( bufferevent_get_output( bev ), str, strlen( str ));
- event_base_dispatch(base);
- return NULL;
- }
- int
- main(int argc, char **argv)
- {
- evthread_use_pthreads();
- pthread_t a, b;
- pthread_create( &a, NULL, startServer, NULL );
- usleep( 5000 ); // wait a bit for the server to come up
- pthread_create( &b, NULL, startClient, NULL );
- pthread_join( a, NULL );
- pthread_join( b, NULL );
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement