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"

运行结果如下:

参考资料

相关推荐
_MyFavorite_4 小时前
JAVA重点基础、进阶知识及易错点总结(28)接口默认方法与静态方法
java·开发语言·windows
取码网4 小时前
最新在线留言板系统PHP源码
开发语言·php
@insist1234 小时前
网络工程师-VLAN 技术原理与配置指南(软考局域网核心考点)
网络·网络工程师·软考·软件水平考试
环黄金线HHJX.4 小时前
龙虾钳足启发的AI集群语言交互新范式
开发语言·人工智能·算法·编辑器·交互
TechWayfarer4 小时前
如何搭建企业级IP归属地查询平台?
网络·网络协议·tcp/ip
TechWayfarer5 小时前
科普:IP归属地中的IDC/机房/家庭宽带有什么区别?
服务器·网络·tcp/ip
旖-旎5 小时前
分治(快速选择算法)(3)
c++·算法·leetcode·排序算法·快速选择
不写八个5 小时前
PHP教程006:ThinkPHP项目入门
开发语言·php
_MyFavorite_5 小时前
JAVA重点基础、进阶知识及易错点总结(31)设计模式基础(单例、工厂)
java·开发语言·设计模式
xiaoye-duck5 小时前
【C++:哈希表封装】哈希表封装 myunordered_map/myunordered_set 实战:底层原理 + 完整实现
数据结构·c++·散列表