libevent::bufferevent
#include <cstdio>
#include <netinet/in.h>
#include <sys/socket.h>
#include <fcntl.h>
#include <event2/event.h>
#include <event2/buffer.h>
#include <event2/bufferevent.h>
#include <assert.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h> #define MAX_LINE 16384 struct fd_state
{
char buffer[MAX_LINE];
size_t buffer_used;
size_t n_written;
size_t write_upto;
struct event*read_event;
struct event*write_event;
}; void run(void);
void do_accept(evutil_socket_t listener, short event, void*arg);
void readcb(struct bufferevent* bev, void * ctx);
void errorcb(struct bufferevent* bev, short error, void * ctx); char rot13_char(char c)
{
if ((c >= 'a' && c <= 'm ') || (c >= 'A ' && c <= 'M '))
return c + ;
else if ((c >= 'n' && c <= 'z') || (c >= 'N' && c <= 'Z'))
return c - ;
else
return c;
} int main(int c, char**v)
{
run();
return ;
} void run(void)
{
evutil_socket_t listener;
struct sockaddr_in sin;
struct event_base*base;
struct event*listener_event;
base = event_base_new();
if (!base)
return; sin.sin_family = AF_INET; sin.sin_addr.s_addr = ;
sin.sin_port = htons();
listener = socket(AF_INET, SOCK_STREAM, );
evutil_make_socket_nonblocking(listener);
/*#ifndef WIN32
{
int one = 1;
setsockopt(listener, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
}
#endif */
if (bind(listener, (struct sockaddr*) &sin, sizeof(sin)) < )
{
perror("bind"); return;
}
if (listen(listener, ) < )
{
perror("listen");
return;
}
listener_event = event_new(base, listener, EV_READ | EV_PERSIST, do_accept, (void*)base); event_add(listener_event, NULL);
event_base_dispatch(base);
} void do_accept(evutil_socket_t listener, short event, void*arg)
{
struct event_base*base = (event_base*)(arg);
struct sockaddr_storage ss;
socklen_t slen = sizeof(ss);
int fd = accept(listener, (struct sockaddr*) &ss, &slen);
if (fd < )
{
perror("accept");
}
else if (fd > FD_SETSIZE)
{
close(fd);
}
else
{
struct bufferevent* bev;
evutil_make_socket_nonblocking(fd);
bev = bufferevent_socket_new(base, fd, BEV_OPT_CLOSE_ON_FREE);
bufferevent_setcb(bev, readcb, NULL, errorcb, NULL);
bufferevent_setwatermark(bev, EV_READ, , MAX_LINE);
bufferevent_enable(bev, EV_READ | EV_WRITE);
}
}
void readcb(struct bufferevent* bev, void * ctx)
{
struct evbuffer* input, *output;
char* line;
size_t n;
int i;
input = bufferevent_get_input(bev);
output = bufferevent_get_output(bev);
while ((line = evbuffer_readln(input, &n, EVBUFFER_EOL_LF)))
{
printf("str = %s \n", line); for (i = ; i < n; ++i)
line[i] = rot13_char(line[i]); evbuffer_add(output, line, n);
evbuffer_add(output, "\n", );
free(line);
} if (evbuffer_get_length(input) >= MAX_LINE)
{
char buf[];
while (evbuffer_get_length(input))
{
int n = evbuffer_remove(input, buf, sizeof(buf));
for (i = ; i < n; ++i)
buf[i] = rot13_char(buf[i]); evbuffer_add(output, buf, n);
}
evbuffer_add(output, "\n", );
}
}
void errorcb(struct bufferevent* bev, short error, void * ctx)
{
if (error & BEV_EVENT_EOF)
{
/* connection has been closed, do any clean up here*/
}
else if (error & BEV_EVENT_ERROR)
{
/* check errno to see what error occurred*/
}
else if (error & BEV_EVENT_TIMEOUT)
{
/* must be a timeout event handle, handle it*/
}
bufferevent_free(bev);
}
libevent::bufferevent的更多相关文章
- libevent+bufferevent总结
libevent+bufferevent总结 1 学习参考网址 libevent学习网址:http://blog.csdn.net/feitianxuxue/article/details/93725 ...
- 一步一步解剖Libevent源代码 - 0
本系列文章将在<Libevent源码深度解剖>的基础上,结合Libevent-2.0.22代码,更新了其中的一些定义和说明,以及加上了bufferevent部分. 一.Libevent ...
- [转载]Parsing X.509 Certificates with OpenSSL and C
Parsing X.509 Certificates with OpenSSL and C Zakir Durumeric | October 13, 2013 While OpenSSL has b ...
- 处理大并发之五 使用libevent利器bufferevent
转自:http://blog.csdn.net/feitianxuxue/article/details/9386843 处理大并发之五 使用libevent利器bufferevent 首先来翻译一段 ...
- libevent源码分析:bufferevent
struct bufferevent定义在文件bufferevent_struct.h中. /** Shared implementation of a bufferevent. This type ...
- (转)Libevent(4)— Bufferevent
转自:http://name5566.com/4215.html 参考文献列表:http://www.wangafu.net/~nickm/libevent-book/ 此文编写的时候,使用到的 Li ...
- Libevent学习笔记(五) 根据例子学习bufferevent
libevent中提供了一个Hello-world.c 的例子,从这个例子可以学习libevent是如何使用bufferevent的. 这个例子在Sample中 这个例子之前讲解过,这次主要看下buf ...
- Libevent学习笔记(四) bufferevent 的 concepts and basics
Bufferevents and evbuffers Every bufferevent has an input buffer and an output buffer. These are of ...
- libevent学习七(bufferevent)
1. 每个bufferevent 都拥有类型为struct evbuffer的input buffer和out buffer,分别供数据读取和数据写入使用. 2.读取和写入数据是通过编写和设置对应的回 ...
随机推荐
- 第二场周赛(递归递推个人Rank赛)——题解
很高兴给大家出题,本次难度低于上一场,新生的六个题都可以直接裸递归式或者裸递推式解决,对于老生的汉诺塔3,需要找出一般式,后两题分别为裸ST算法(或线段树)/线性DP. 正确的难度顺序为 种花 角谷定 ...
- 第一次参与国际空间站ISS 的SSTV活动
先来看看本次 ISS 的 SSTV活动公告 SSTV Event planned for Early August ARISS News Release ...
- C++解决最基本的迷宫问题
问题描述:给定一个最基本的迷宫图,用一个数组表示,值0表示有路,1表示有障碍物,找一条,从矩阵的左上角,到右下角的最短路.求最短路,大家最先想到的可能是用BFS求,本文也是BFS求最短路的. 源代码如 ...
- hibernate集成ehcahe进行缓存管理
ehcace是现在非常流行的缓存框架,有轻量.灵活.可扩展.支持集群/分布式等优点. 在项目中,使用ehcace可以对数据进行缓存(一般使用.基于注解.基于aop),使用filter可以对页面进行缓存 ...
- UVM——寄存器模型相关的一些函数
0. 引言 在UVM支持的寄存器操作中,有get.update.mirror.write等等一些方法,在这里整理一下他们的用法. 寄存器模型中的寄存器值应该与DUT保持同步,但是由于DUT的值是实时更 ...
- Go微服务容错与韧性(Service Resilience)
Service Resilience是指当服务的的运行环境出现了问题,例如网络故障或服务过载或某些微服务宕机的情况下,程序仍能够提供部分或大部分服务,这时我们就说服务的韧性很强.它是微服务中很重要的一 ...
- sql server编写archive通用模板脚本实现自动分批删除数据
博主做过比较多项目的archive脚本编写,对于这种删除数据的脚本开发,肯定是一开始的话用最简单的一个delete语句,然后由于部分表数据量比较大啊,索引比较多啊,会发现删除数据很慢而且影响系统的正常 ...
- Spring boot 官网学习笔记 - 开发第一个Spring boot web应用程序(使用mvn执行、使用jar执行)
Creating the POM <?xml version="1.0" encoding="UTF-8"?> <project xmlns= ...
- Maven 梳理-自动创建Maven项目(非web)
mvn archetype:create和mvn archetype:generate create is deprecated in maven 3.0.5 and beyond,在maven3.0 ...
- 【SQL server基础】判断数据库、表格、视图、存储过程、函数书否存在
库是否存在 if exists(select * from master..sysdatabases where name=N'库名') print 'exists' else print 'not ...