用libevent写个简单的server/client

来源:互联网 发布:3d网络渲染 编辑:程序博客网 时间:2024/05/21 12:45

libevent是一个轻量级的事件触发库,可以很好地利用在网络通讯上面,用其进行大量的异步,延时,重发等场景。而且libevent里面大量运用了函数指针,用户层/底层 分离,对于提高自己代码构架很有帮助。

下面是一个server的demo

#include includevoid cb_func(evutil_socket_t fd, short what, void *arg){        int  client_len;        evutil_socket_t client_fd;        struct sockaddr_in client_address;        evutil_socket_t fd1 = *(evutil_socket_t *)arg;        printf("Got an event on socket %d:%s%s%s%s \n\r",            (int) fd,            (what&EV_TIMEOUT) ? " timeout" : "",            (what&EV_READ)    ? " read" : "",            (what&EV_WRITE)   ? " write" : "",            (what&EV_SIGNAL)  ? " signal" : "");        client_fd=accept(fd1, (struct sockaddr *)&client_address, &client_len);         }void main_loop(evutil_socket_t fd1){        struct event *ev1, *ev2;        struct timeval five_seconds = {5,0};        struct event_base *base = event_base_new();        /* The caller has already set up fd1, fd2 somehow, and make them nonblocking. */    /* 初始化事件 */        ev1 = event_new(base, fd1, EV_READ|EV_PERSIST, cb_func,&fd1);       //EV_PERSIST选项相当于让event_add()持续有效        /* 注册事件 */        event_add(ev1, NULL);        //event_add(ev1, &five_seconds);        /* 循环监听 */        event_base_dispatch(base);}int main(){    evutil_socket_t server_sockfd, client_sockfd;    int server_len, client_len;    struct sockaddr_in server_address;    struct sockaddr_in client_address;/*  Remove any old socket and create an unnamed socket for the server.  */    server_sockfd = socket(AF_INET, SOCK_STREAM, 0);/*  Name the socket.  */    server_address.sin_family = AF_INET;    server_address.sin_addr.s_addr = htonl(INADDR_ANY);    server_address.sin_port = htons(9734);    server_len = sizeof(server_address);    bind(server_sockfd, (struct sockaddr *)&server_address, server_len);//  Create a connection queue and wait for clients.      listen(server_sockfd, 5);    main_loop(server_sockfd);}
0 0