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.读取和写入数据是通过编写和设置对应的回 ...
随机推荐
- Linux 笔记 - 第十八章 Linux 集群之(一)Keepalived 高可用集群
一.前言 Linux 集群从功能上可以分为两大类:高可用集群和负载均衡集群.此处只讲高可用集群,负载均衡放在下一篇博客讲解. 高可用集群(High Availability Cluster,简称 HA ...
- charles 黑名单
本文参考:charles 黑名单 charles 黑名单 功能:阻止对匹配HOST的请求:可以直接把请求丢掉,也可以直接返回403状态码: 我一般用黑名单工具来block一些软件的自动上传功能 黑名单 ...
- 讨厌的Permission denied:adb访问手机目录时,怎么处理Permission denied问题
故事背景 手机某app出现了无响应,我想找到手机anr日志 但我只知道在data目录的某个目录里有个tra**的文件里有anr日志 具体的我真忘了,所以想要进入data中用ls查看一下 结果就出现了讨 ...
- tomcat下配置jndi数据源c3p0
Tomcat下通过JNDI配置数据源,使用c3p0连接池 首先在打开tomcat找到在conf文件下,找到server.xml 在server.xml文件中找到标签 在下面添加如下配置 <Res ...
- Game with string CodeForce#1104B 栈、串
题目链接:Game with string 题目原文 Two people are playing a game with a string
- selenium-03-01截图函数
UI自动化测试执行过程中,当遇到检查失败的情况,往往会发现打印的log并不能有效地帮助我们定位问题.我们需要失败时刻的屏幕截图来重现当时的失败场景,进而排查出错原因. 基于这种需求可以使用Sele ...
- Mybaits-从零开始-Hello World(暂不考虑命名规范化)
1.mybatis-config.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE ...
- 注意!GetThreadPriority的返回值不是系统的优先级值
GetThreadPriority的返回值 Return code/value Description THREAD_PRIORITY_ABOVE_NORMAL 1 Priority 1 point ...
- asp.net编译中出现 数据库 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\test1.mdf' 已存在。请选择其他数据库名称。
关于asp.net编译中出现数据库 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\test1.mdf ...
- python正则表达式贪婪算法与非贪婪算法与正则表达式子模式的简单应用
先引入一下百度百科对于正则表达式的概念: 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种 ...