libevent 示例代码

来源:互联网 发布:sql语句编写技巧 编辑:程序博客网 时间:2024/06/05 03:48

server.cpp

#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <math.h>#include <string.h>#include <assert.h>#include <netinet/in.h>#include <sys/file.h>#include <sys/socket.h>#include <sys/types.h>#include "event.h"#define MAX_BUF_LEN 1024 void read_cb(struct bufferevent *bev, void *arg) {        char line[MAX_BUF_LEN+1];        int n;        evutil_socket_t fd = bufferevent_getfd(bev);        while (n = bufferevent_read(bev, line, MAX_BUF_LEN), n > 0) {                line[n] = '\0';                printf("fd=%u, read line: %s\n", fd, line);                bufferevent_write(bev, line, n);                if(strcmp(line, "quit") == 0 ||                         strcmp(line, "exit") == 0){                        close(fd);                }        }}void write_cb(struct bufferevent *bev, void *arg) {}void error_cb(struct bufferevent *bev, short event, void *arg) {        evutil_socket_t fd = bufferevent_getfd(bev);        printf("fd = %u, ", fd);        if (event & BEV_EVENT_TIMEOUT) {                printf("Timed out\n"); //if bufferevent_set_timeouts() called        }else if (event & BEV_EVENT_EOF) {                printf("connection closed\n");        }else if (event & BEV_EVENT_ERROR) {                printf("some other error\n");        }        bufferevent_free(bev);}void handleConnection(evutil_socket_t listen_fd, short event_type, void *arg){        event_base *base = (struct event_base *)arg;        evutil_socket_t fd;        sockaddr_in sin;        socklen_t slen;        fd = accept(listen_fd, (struct sockaddr *)&sin, &slen);        if (fd < 0) {                perror("accept");                return;        }        if (fd > FD_SETSIZE) {                perror("fd > FD_SETSIZE\n");                return;        }        printf("ACCEPT: fd = %u\n", fd);        bufferevent *bev = bufferevent_socket_new(base, fd, BEV_OPT_CLOSE_ON_FREE);        bufferevent_setcb(bev, read_cb, NULL, error_cb, arg);        bufferevent_enable(bev, EV_READ|EV_WRITE|EV_PERSIST);}int main(int argc, char** argv) {        event_base *base = event_base_new();        event *listen_event;        int listen_fd;        uint16_t server_port = 9999;        sockaddr_in server_addr;        assert(base != NULL);        listen_fd = socket(AF_INET, SOCK_STREAM, 0);        evutil_make_socket_nonblocking(listen_fd);        assert(listen_fd != -1);        memset(&server_addr, 0, sizeof(server_addr));        server_addr.sin_family = AF_INET;        server_addr.sin_addr.s_addr = htonl(INADDR_ANY);        server_addr.sin_port = htons(server_port);        bind(listen_fd, (sockaddr*) &server_addr, sizeof(server_addr));        listen(listen_fd, 16);        printf("Listening ...\n");        listen_event = event_new(base, listen_fd, EV_READ|EV_PERSIST, handleConnection, (void*)base);        event_add(listen_event, NULL);        event_base_dispatch(base);        return 0;}

客户端代码可以参考epoll 示例代码中的client.cpp

原创粉丝点击