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"

运行结果如下:

参考资料

相关推荐
大肥羊学校懒羊羊2 分钟前
完数与盈数的计算题解
数据结构·c++·算法
澈2073 分钟前
构造函数与析构函数完全指南
开发语言·c++
W23035765737 分钟前
C++ 高并发线程池实战(二):动态缓存线程池 + 调用者运行拒绝策略完整版实现
开发语言·c++·缓存
气宇轩昂固执狂9 分钟前
01-初识C语言
c语言·开发语言
t***54417 分钟前
如何在 Dev-C++ 中使用 Clang 编译器
开发语言·c++
VOOHU-沃虎30 分钟前
强抗振、高可靠:RJ45卡侬自锁连接器在工业恶劣环境中的选型指南
网络·工业控制
hhb_61837 分钟前
Go高性能并发编程实战与底层原理剖析
运维·网络·golang
cany100040 分钟前
C++ - 智能指针
开发语言·c++
我要升天!1 小时前
C语言连接 MySQL:libmysqlclient 获取方式详解
c语言·开发语言·数据库·mysql·adb
道清茗1 小时前
【RH294知识点汇总】第 6 章 《 管理复杂的 Play 和 Playbook 》常见问题
linux·服务器·网络