基于libevent的高性能网络服务器 – evpp
evpp
简介
evpp是一个基于libevent开发的现代化C++11高性能网络服务器,自带TCP/UDP/HTTP等协议的异步非阻塞式的服务器和客户端库。
特性
现代版的C++11接口
非阻塞异步接口都是C++11的functional/bind形式的回调仿函数(不是libevent中的C风格的函数指针)
非阻塞纯异步多线程TCP服务器/客户端
非阻塞纯异步多线程HTTP服务器/客户端
非阻塞纯异步多线程UDP服务器
支持多进程模式
优秀的跨平台特性和高性能(继承自libevent的优点)
除此之外,基于该库之上,还提供两个附带的应用层协议库:
evmc :一个纯异步非阻塞式的memcached的C++客户端库,支持membase集群模式。
evnsq : 一个纯异步非阻塞式的NSQ的C++客户端库,支持消费者、生产者、服务发现等特性。
将来还会推出redis的客户端库。
示例
An echo TCP server
#include <evpp/exp.h> #include <evpp/tcp_server.h> #include <evpp/tcp_conn.h> #include <evpp/buffer.h> void OnMessage(const evpp::TCPConnPtr& conn,
evpp::Buffer* msg,
evpp::Timestamp ts) {
std::string s = msg->NextAllString();
LOG_INFO << "Received a message [" << s << "]";
conn->Send(s); if (s == "quit" || s == "exit") {
conn->Close();
}
} int main(int argc, char* argv[]) {
std::string addr = std::string("0.0.0.0:9999");
evpp::EventLoop loop;
evpp::TCPServer server(&loop, addr, "TCPEcho", 0);
server.SetMessageCallback(&OnMessage);
server.Init();
server.Start();
loop.Run(); return 0;
}
An echo HTTP server
#include <evpp/exp.h> #include <evpp/http/http_server.h> void RequestHandler(evpp::EventLoop* loop, const evpp::http::ContextPtr& ctx, const evpp::http::HTTPSendResponseCallback& cb) { cb(ctx->body.ToString());
} int main(int argc, char* argv[]) {
std::vector<int> ports = {9009, 23456, 23457}; int thread_num = 2;
evpp::http::Server server(thread_num);
server.RegisterHandler("/echo", &RequestHandler);
server.Init(ports);
server.Start(); while (!server.IsStopped()) { usleep(1);
} return 0;
}
An echo UDP server
#include <evpp/exp.h> #include <evpp/udp/udp_server.h> #include <evpp/udp/udp_message.h> void DefaultHandler(evpp::EventLoop* loop, evpp::udp::MessagePtr& msg) { evpp::udp::SendMessage(msg);
} int main(int argc, char* argv[]) {
std::vector<int> ports = {1053, 5353};
evpp::udp::Server server;
server.SetMessageHandler(&DefaultHandler);
server.Init(ports);
server.Start(); while (!server.IsStopped()) { usleep(1);
} return 0;
}