evpp-现代化C++11高性能的Reactor模式的C++网络库
evpp项目简介
evpp是一个基于libevent开发的现代化C++11高性能网络服务器,自带TCP/UDP/HTTP等协议的异步非阻塞式的服务器和客户端库。具体简介可以详见:https://github.com/Qihoo360/evpp/blob/master/readme_cn.md
evpp特性
- 现代版的C++11接口
- 非阻塞异步接口都是C++11的functional/bind形式的回调仿函数(不是[libevent]中的C风格的函数指针)
- CPU多核友好和线程安全
- 非阻塞纯异步多线程TCP服务器/客户端
- 非阻塞纯异步多线程HTTP服务器/客户端
- 非阻塞纯异步多线程UDP服务器
- 支持多进程模式
- 优秀的跨平台特性和高性能(继承自[libevent]的优点)
- 已经经过详尽的测试,并已经用于生产环境,每天承载数万亿次的网络通信
- 非常容易安装和集成,[evpp] 能够很容易就打包出 deb/rpm/tar.gz 等格式的安装包
除此之外,基于该库之上,还提供两个附带的应用层协议库:
- evmc :一个纯异步非阻塞式的
memcached的C++客户端库,支持membase集群模式。该库已经用于生产环境,每天发起3000多亿 次memcache查询请求。详情请见:evmc readme - evnsq: 一个纯异步非阻塞式的
NSQ的C++客户端库,支持消费者、生产者、服务发现等特性。该库已经用于生产环境,每天生产1300多亿 条日志消息。详情请见:evnsq readme
将来还会推出redis的客户端库。
在Windows11上使用Visual Studio 2026编译源代码-基于vcpkg
Windows11中使用vcpkg安装依赖库
Windows11使用Visual Studio可以参考官方提供的quick_start_windows_with_visualstudio.md这篇wiki,不过毕竟这个项目已经有超过4年没维护了,使用的是Visual Studio 2015和Visual Studio 2017,CMake是基于CMake 3.8.0版本,相对比较老。
在Windows11中官方使用vcpkg工具安装相关依赖库:libevent,glog,gtest,gflags.
由于我的Windows电脑是x64的,安装好vcpkg之后可以直接打开cmd命令行窗口运行如下命令:
bash
D:\env\vcpkg>vcpkg install gflags:x64-windows
D:\env\vcpkg>vcpkg install glog:x64-windows
D:\env\vcpkg>vcpkg install openssl:x64-windows
D:\env\vcpkg>vcpkg install libevent:x64-windows
D:\env\vcpkg>vcpkg install thrift:x64-windows
下载evpp源代码
bash
$ git clone https://github.com/Qihoo360/evpp
$ cd evpp
$ git submodule update --init --recursive
使用cmake和VS2026编译evpp源代码
bash
D:\env\evpp>md build
D:\env\evpp>cd build
D:\env\evpp\build>cmake -DCMAKE_TOOLCHAIN_FILE=D://env/vcpkg/scripts/buildsystems/vcpkg.cmake -G "Visual Studio 18 2026" -DCMAKE_POLICY_VERSION_MINIMUM=3.5 ..
D:\env\evpp\build>start safe-evpp.sln
当然,编译过程中可能会报一些错误,可以借助Github Copilot等AI工具解决编译报错问题,主要原因是evpp库依赖于libevent,glog,gtest,gflags,并且当时使用的是VS2015和VS2017编译构建的,依赖库版本较老,需要自己手动更新一下。
将evpp作为库使用
如果你仅仅希望将evpp作为库使用,你可以使用vcpkg安装evpp:
bash
D:\env\vcpkg>vcpkg install evpp
这将在你的本地机器上安装evpp。然后,你可以在你自己的应用程序中使用evpp
VS2026中运行evpp示例程序
我们以evpp源代码示例项目中的example_tcp_server和example_tcp_client这两个实例程序为例,使用VS2026便于并运行
1.先运行example_tcp_server服务器端
example_tcp_server服务端的源代码如下:
tcp_server.cc
https://github.com/Qihoo360/evpp/blob/master/examples/tcp/tcp_server.cc
cpp
#include <evpp/tcp_server.h>
#include <evpp/buffer.h>
#include <evpp/tcp_conn.h>
int main(int argc, char* argv[]) {
std::string addr = "0.0.0.0:9099";
int thread_num = 4;
evpp::EventLoop loop;
evpp::TCPServer server(&loop, addr, "TCPEchoServer", thread_num);
server.SetMessageCallback([](const evpp::TCPConnPtr& conn,
evpp::Buffer* msg) {
conn->Send(msg);
});
server.SetConnectionCallback([](const evpp::TCPConnPtr& conn) {
if (conn->IsConnected()) {
LOG_INFO << "A new connection from " << conn->remote_addr();
} else {
LOG_INFO << "Lost the connection from " << conn->remote_addr();
}
});
server.Init();
server.Start();
loop.Run();
return 0;
}
#include "../winmain-inl.h"
运行结果如下:

2.再运行example_tcp_client客户端程序
example_tcp_client客户端源代码如下:
tcp_client.cc:
https://github.com/Qihoo360/evpp/blob/master/examples/tcp/tcp_client.cc
cpp
#include <evpp/tcp_client.h>
#include <evpp/buffer.h>
#include <evpp/tcp_conn.h>
int main(int argc, char* argv[]) {
std::string addr = "127.0.0.1:9099";
if (argc == 2) {
addr = argv[1];
}
evpp::EventLoop loop;
evpp::TCPClient client(&loop, addr, "TCPPingPongClient");
client.SetMessageCallback([&loop, &client](const evpp::TCPConnPtr& conn,
evpp::Buffer* msg) {
LOG_TRACE << "Receive a message [" << msg->ToString() << "]";
client.Disconnect();
});
client.SetConnectionCallback([](const evpp::TCPConnPtr& conn) {
if (conn->IsConnected()) {
LOG_INFO << "Connected to " << conn->remote_addr();
conn->Send("hello");
} else {
conn->loop()->Stop();
}
});
client.Connect();
loop.Run();
return 0;
}
#include "../echo/tcpecho/winmain-inl.h"
运行结果如下:
