evpp-现代化C++11高性能的Reactor模式的C++网络库

evpp-现代化C++11高性能的Reactor模式的C++网络库

evpp项目简介

evpp是一个基于libevent开发的现代化C++11高性能网络服务器,自带TCP/UDP/HTTP等协议的异步非阻塞式的服务器和客户端库。具体简介可以详见:https://github.com/Qihoo360/evpp/blob/master/readme_cn.md

evpp特性

  1. 现代版的C++11接口
  2. 非阻塞异步接口都是C++11的functional/bind形式的回调仿函数(不是libevent中的C风格的函数指针)
  3. CPU多核友好和线程安全
  4. 非阻塞纯异步多线程TCP服务器/客户端
  5. 非阻塞纯异步多线程HTTP服务器/客户端
  6. 非阻塞纯异步多线程UDP服务器
  7. 支持多进程模式
  8. 优秀的跨平台特性和高性能(继承自libevent的优点)
  9. 已经经过详尽的测试,并已经用于生产环境,每天承载数万亿次的网络通信
  10. 非常容易安装和集成,evpp 能够很容易就打包出 deb/rpm/tar.gz 等格式的安装包

除此之外,基于该库之上,还提供两个附带的应用层协议库:

  1. evmc :一个纯异步非阻塞式的memcached的C++客户端库,支持membase集群模式。该库已经用于生产环境,每天发起3000多亿 次memcache查询请求。详情请见:evmc readme
  2. 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"

运行结果如下:

参考资料

相关推荐
BadBadBad__AK6 小时前
线段树维护区间 k 次方和
c++·数学·算法·stl
卷无止境18 小时前
Eigen 库如何借助 OpenMP 加速计算
c++·后端
卷无止境19 小时前
OpenMPI、MPICH 与 OpenMP:关系、核心概念与架构全解
c++·后端
郝学胜_神的一滴2 天前
CMake 30:循环语法全解|foreach_while双循环精讲、迭代技巧与实战避坑指南
c++·cmake
卷无止境4 天前
C++ 的Eigen 库全解析
c++
卷无止境4 天前
现代 C++特性大盘点:一门脱胎换骨的老语言
c++·后端
郝学胜_神的一滴4 天前
CMake 27:缓存变量的特性、语法、类型与实操全解
c++·cmake
博客18006 天前
酷宝的使用方法,超好用的免费界面库,C++、MFC可用
c++·mfc·界面库·库来帮·酷宝
郝学胜_神的一滴6 天前
CMake 026:属性体系精讲、四大作用域全解 & 实战代码落地
c++·cmake
众少成多积小致巨6 天前
JNI (Java Native Interface) 技术手册中文参考指南
android·java·c++