diff --git a/test_bufffer_filter/Makefile b/test_bufffer_filter/Makefile
new file mode 100644
index 0000000..19021e7
--- /dev/null
+++ b/test_bufffer_filter/Makefile
@@ -0,0 +1,2 @@
+test_bufffer_filter: test_bufffer_filter.cpp
+ g++ $^ -o $@ -levent
\ No newline at end of file
diff --git a/test_bufffer_filter/first_libevent.vcxproj b/test_bufffer_filter/first_libevent.vcxproj
new file mode 100644
index 0000000..02c91e8
--- /dev/null
+++ b/test_bufffer_filter/first_libevent.vcxproj
@@ -0,0 +1,162 @@
+
+
+
+
+ Debug
+ Win32
+
+
+ Release
+ Win32
+
+
+ Debug
+ x64
+
+
+ Release
+ x64
+
+
+
+ 15.0
+ {129BF326-BFEE-4F1C-920C-0C302BB84895}
+ Win32Proj
+ firstlibevent
+ 10.0.17763.0
+ test_bufffer_filter
+
+
+
+ Application
+ true
+ v141
+ Unicode
+
+
+ Application
+ false
+ v141
+ true
+ Unicode
+
+
+ Application
+ true
+ v141
+ Unicode
+
+
+ Application
+ false
+ v141
+ true
+ Unicode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+
+
+ true
+
+
+ false
+
+
+ false
+
+
+
+
+
+ Level3
+ Disabled
+ true
+ WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ true
+
+
+ Console
+ true
+
+
+
+
+ NotUsing
+ Level3
+ Disabled
+ true
+ _DEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ true
+ ..\..\include
+
+
+ Console
+ true
+ ..\..\lib
+ libevent.lib;ws2_32.lib;%(AdditionalDependencies)
+
+
+
+
+
+
+ Level3
+ MaxSpeed
+ true
+ true
+ true
+ WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ true
+
+
+ Console
+ true
+ true
+ true
+
+
+
+
+
+
+ Level3
+ MaxSpeed
+ true
+ true
+ true
+ NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ true
+
+
+ Console
+ true
+ true
+ true
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test_bufffer_filter/test_bufffer_filter.cpp b/test_bufffer_filter/test_bufffer_filter.cpp
new file mode 100644
index 0000000..fdb8893
--- /dev/null
+++ b/test_bufffer_filter/test_bufffer_filter.cpp
@@ -0,0 +1,155 @@
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#ifdef _WIN32
+
+#else
+#include
+#endif // !_WIN32
+
+using namespace std;
+
+#define SPORT 5001
+
+bufferevent_filter_result filter_in(struct evbuffer *src, struct evbuffer *dst, ev_ssize_t dst_limit,
+ enum bufferevent_flush_mode mode, void *ctx)
+{
+ cout << "filter_in" << endl;
+ //读取并清理原数据
+ char data[1024] = {0};
+ int len = evbuffer_remove(src,data,sizeof(data)-1);
+
+ //将所有转为大写
+ for(int i=0;i < len ;i++){
+ data[i] = toupper(data[i]);
+ }
+
+ evbuffer_add(dst,data,len);
+ return BEV_OK;
+}
+
+bufferevent_filter_result filter_out(struct evbuffer *src, struct evbuffer *dst, ev_ssize_t dst_limit,
+ enum bufferevent_flush_mode mode, void *ctx)
+{
+ cout << "filter_out" << endl;
+
+ //读取并清理原数据
+ char data[1024] = {0};
+ int len = evbuffer_remove(src,data,sizeof(data)-1);
+
+ string str = "";
+ str += "==================\n";
+ str += data;
+ str += "==================\n";
+
+ evbuffer_add(dst,str.c_str(),str.size());
+
+ return BEV_OK;
+}
+
+void read_cb(bufferevent *bev ,void *arg){
+ cout << "read_cb" << endl;
+ char data[1024] = {0};
+ int len = bufferevent_read(bev,data,sizeof(data)-1);
+ cout << data << endl;
+
+ //回复客户端消息,经过输出过滤器
+ bufferevent_write(bev,data,len);
+
+}
+
+void write_cb(bufferevent *bev ,void *arg){
+ cout << "write_cb" << endl;
+}
+
+void event_cb(bufferevent *bev ,short events ,void *arg){
+ cout << "event_cb" << endl;
+}
+
+void listen_cb(struct evconnlistener *e, evutil_socket_t s, struct sockaddr *a, int socklen, void *arg)
+{
+ std::cout << "listen to be" << std::endl;
+ //创建bufferevent 绑定bufferevent filter
+ event_base *base = (event_base *)arg;
+ bufferevent *bev = bufferevent_socket_new(base, s, BEV_OPT_CLOSE_ON_FREE);
+ bufferevent *bev_filter = bufferevent_filter_new(bev,
+ filter_in,
+ filter_out,
+ BEV_OPT_CLOSE_ON_FREE,
+ 0,
+ 0);
+
+ //设置bufferevent回调
+ bufferevent_setcb(bev_filter,read_cb,write_cb,event_cb,NULL);
+
+ bufferevent_enable(bev_filter,EV_READ|EV_WRITE);
+
+
+}
+
+int main()
+{
+#ifdef _WIN32
+ //初始化socket库
+ WSADATA wsa;
+ WSAStartup(MAKEWORD(2, 2), &wsa);
+#else
+ if (signal(SIGPIPE, SIG_IGN) == SIG_ERR)
+ { //忽略管道信号,发送数据给已关闭的socket,会飞掉!
+ return 1;
+ }
+#endif
+
+ //初始化libevent上下文
+ event_config *conf = event_config_new();
+
+ //windows中支持IOCP(线程池) 要查看该项是否开启成功,可以在运行程序后打开任务管理器查看线程数量
+#ifdef _WIN32
+ event_config_set_flag(conf, EVENT_BASE_FLAG_STARTUP_IOCP);
+ evthread_use_windows_threads();
+ //设置cpu数量
+ SYSTEM_INFO si;
+ GetSystemInfo(&si);
+ event_config_set_num_cpus_hint(conf, si.dwNumberOfProcessors);
+#endif
+
+ //初始化配置上下文
+ event_base *base = event_base_new_with_config(conf);
+
+ if (!base)
+ {
+ cout << "event_base_new_with_config failed!" << endl;
+ base = event_base_new();
+ if (!base)
+ {
+ cerr << "event_base_new failed" << endl;
+ return 0;
+ }
+ }
+ else
+ {
+ sockaddr_in sin;
+ memset(&sin, 0, sizeof(sin));
+ sin.sin_family = AF_INET;
+ sin.sin_port = htons(SPORT);
+
+ evconnlistener *ev = evconnlistener_new_bind(base, //libevent上下文
+ listen_cb, //接收到连接的回调函数
+ base, //回调函数获取的参数(根据业务来)
+ LEV_OPT_REUSEABLE | LEV_OPT_CLOSE_ON_FREE, //地址重用,evconnlistener关闭同时关闭socket
+ 10, //连接队列大小,对应listen函数参数
+ (sockaddr *)&sin, //绑定的地址和端口
+ sizeof(sin));
+ event_base_dispatch(base);
+ event_base_free(base);
+ evconnlistener_free(ev);
+
+ event_config_free(conf);
+ }
+ return 0;
+}
diff --git a/test_bufffer_filter/test_bufffer_filter.sln b/test_bufffer_filter/test_bufffer_filter.sln
new file mode 100644
index 0000000..9343ad4
--- /dev/null
+++ b/test_bufffer_filter/test_bufffer_filter.sln
@@ -0,0 +1,31 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 15
+VisualStudioVersion = 15.0.28307.1525
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "first_libevent", "first_libevent.vcxproj", "{129BF326-BFEE-4F1C-920C-0C302BB84895}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|x64 = Debug|x64
+ Debug|x86 = Debug|x86
+ Release|x64 = Release|x64
+ Release|x86 = Release|x86
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {129BF326-BFEE-4F1C-920C-0C302BB84895}.Debug|x64.ActiveCfg = Debug|x64
+ {129BF326-BFEE-4F1C-920C-0C302BB84895}.Debug|x64.Build.0 = Debug|x64
+ {129BF326-BFEE-4F1C-920C-0C302BB84895}.Debug|x86.ActiveCfg = Debug|Win32
+ {129BF326-BFEE-4F1C-920C-0C302BB84895}.Debug|x86.Build.0 = Debug|Win32
+ {129BF326-BFEE-4F1C-920C-0C302BB84895}.Release|x64.ActiveCfg = Release|x64
+ {129BF326-BFEE-4F1C-920C-0C302BB84895}.Release|x64.Build.0 = Release|x64
+ {129BF326-BFEE-4F1C-920C-0C302BB84895}.Release|x86.ActiveCfg = Release|Win32
+ {129BF326-BFEE-4F1C-920C-0C302BB84895}.Release|x86.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {191D7F93-7554-493B-92E1-BB302C5A8383}
+ EndGlobalSection
+EndGlobal