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"

运行结果如下:

参考资料

相关推荐
Wang's Blog3 小时前
Go-Zero项目开发4: 用户服务搜索、详情与统一错误处理
开发语言·golang
ysa0510304 小时前
【板子】Dinic(最大网络流)
网络
我星期八休息4 小时前
网络编程—应用层HTTP协议
linux·运维·开发语言·前端·网络·网络协议·http
梅雅达编程笔记4 小时前
零基础学 Python 第14章 | 模块、包与第三方库
开发语言·python·django·numpy·pandas
Mr__Miss4 小时前
Java泛型完全指南:从入门到精通
java·开发语言·python
赵庆明老师4 小时前
Vben精讲:14-Vben远程加载语言包
开发语言·vben
jinyishu_5 小时前
模拟实现 C++ 栈和队列——从适配器模式看懂 STL 容器之美
java·c++·适配器模式
hehelm5 小时前
AI大模型接入SDK—通用模块设计
linux·开发语言·c++
ITxiaobing20235 小时前
IP库与AppsFlyer数据对账指南:破解国家/地区数据不一致的难题
网络·网络协议
有浔则灵5 小时前
GORM钩子函数详解
网络·安全·web安全