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
阅读全文
0 0
- libevent示例代码
- libevent 示例代码
- libevent简单示例
- libevent介绍及示例
- Libevent示例程序1
- libevent介绍及示例
- libevent简单echo示例
- libevent介绍及示例
- libevent介绍及示例
- php libevent 扩展使用示例
- Libevent示例程序4 信号量
- 基于libevent的服务器示例
- libevent介绍及示例 2
- libevent http库-使用示例
- 工作代码片段-libevent
- libevent 测试代码
- libevent 1.0代码阅读
- libevent代码阅读
- MOOC清华《程序设计基础》期末考试第5题:解密外星人ET的聊天记录
- 杭电ACM1718 名次
- vue.js 微信支付前端代码
- Python学习6-函数
- 机器学习算法总结--提升方法
- libevent 示例代码
- jsp页面获取服务器时间
- sublime text 3 安装、添加命令行启动、汉化、注册码
- 游戏开发常用的算法
- [leetcode] 19. Remove Nth Node From End of Lis
- MAVEN的常用操作
- 饿了么项目(二)
- laravel缓存
- 最小生成树之prim算法