evpp alternatives and similar libraries
Based on the "Networking" category.
Alternatively, view evpp alternatives based on common mentions on social networks and blogs.
-
libcurl
A command line tool and library for transferring data with URL syntax, supporting DICT, FILE, FTP, FTPS, GOPHER, GOPHERS, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, POP3, POP3S, RTMP, RTMPS, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET, TFTP, WS and WSS. libcurl offers a myriad of powerful features -
POCO
The POCO C++ Libraries are powerful cross-platform C++ libraries for building network- and internet-based applications that run on desktop, server, mobile, IoT, and embedded systems. -
C++ REST SDK
The C++ REST SDK is a Microsoft project for cloud-based client-server communication in native code using a modern asynchronous C++ API design. This project aims to help C++ developers connect to and interact with services. -
RakNet
DISCONTINUED. RakNet is a cross platform, open source, C++ networking engine for game programmers. -
Simple-Web-Server
DISCONTINUED. A very simple, fast, multithreaded, platform independent HTTP and HTTPS server and client library implemented using C++11 and Boost.Asio. Created to be an easy way to make REST resources available from C++ applications. -
wdt
DISCONTINUED. Warp speed Data Transfer (WDT) is an embeddedable library (and command line tool) aiming to transfer data between 2 systems as fast as possible over multiple TCP paths. -
PcapPlusPlus
PcapPlusPlus is a multiplatform C++ library for capturing, parsing and crafting of network packets. It is designed to be efficient, powerful and easy to use. It provides C++ wrappers for the most popular packet processing engines such as libpcap, Npcap, WinPcap, DPDK, AF_XDP and PF_RING. -
cpp-netlib
The C++ Network Library Project -- cross-platform, standards compliant networking library. -
Restbed
Corvusoft's Restbed framework brings asynchronous RESTful functionality to C++14 applications. -
Silicon
A high performance, middleware oriented C++14 http web framework please use matt-42/lithium instead -
Simple-WebSocket-Server
DISCONTINUED. A very simple, fast, multithreaded, platform independent WebSocket (WS) and WebSocket Secure (WSS) server and client library implemented using C++11, Boost.Asio and OpenSSL. Created to be an easy way to make WebSocket endpoints in C++. -
RESTinio
Cross-platform, efficient, customizable, and robust asynchronous HTTP(S)/WebSocket server C++ library with the right balance between performance and ease of use -
nope.c
WAFer is a C language-based software platform for scalable server-side and networking applications. Think node.js for C programmers. -
IXWebSocket
websocket and http client and server library, with TLS support and very few dependencies -
mailio
mailio is a cross platform C++ library for MIME format and SMTP, POP3 and IMAP protocols. It is based on standard C++ 17 and Boost library. -
QuantumGate
QuantumGate is a peer-to-peer (P2P) communications protocol, library and API written in C++. -
NetIF
Header-only C++14 library for getting addresses associated with network interfaces without name lookups on Windows, macOS, Linux, and FreeBSD
InfluxDB - Purpose built for real-time analytics at any scale.
* Code Quality Rankings and insights are calculated and provided by Lumnify.
They vary from L1 to L5 with "L5" being the highest.
Do you think we are missing an alternative of evpp or a related project?
Popular Comparisons
README
evpp
Introduction [中文说明](readme_cn.md)
evpp is a modern C++ network library for developing high performance network services using TCP/UDP/HTTP protocols. evpp provides a TCP Server to support multi-threaded nonblocking event-driven server and also a HTTP, UDP Server to support HTTP and UDP protocols.
Features
- Modern C++11 interface
- Modern functional/bind style callback instead of C-style function pointer.
- Multi-core friendly and thread-safe
- A nonblocking multi-threaded TCP server
- A nonblocking TCP client
- A nonblocking multi-threaded HTTP server based on the buildin http server of libevent
- A nonblocking HTTP client
- A nonblocking multi-threaded UDP server
- Async DNS resolving
- EventLoop/ThreadPool/Timer
- Well tested — evpp is well tested with unit tests and stress tested daily in production. It has been used in production and processes 1000+ billions networking communications every day in our production
- Easy install — evpp can be packaged as a deb, rpm, tar.gz with a single command for straight forward distribution and integration
And also provides some libraries based on evpp:
- evmc a nonblocking async C++ memcached (or membase cluster) client library. This library is currently used in production which sends more than 300 billions requests every day. See evmc readme for more details.
- evnsq a nonblocking async C++ NSQ client library. This library is currently used in production which processes more than 130 billions messages every day. See evnsq readme for more details.
NOTE: master is our development branch and may not be stable at all times.
Origin
In our business system, we need to build a TCP long-connection Gateway and other TCP services. When we do a survey of the open sources, we cannot find any appropriate network library for our demands. According to our own business characteristic, an ideal C++ network library must have the features below:
- A simple enough C++ interface
- Support multi-threads and multi-processes
- Based on libevent is preferable for our projects. Given your older applications were based on libevent, it was preferable to have your new framework also be based on it, so as to reduce the overall time/effort/cost to completion. Actually, we do have some older applications which were based on libevent.
As described above, there are not many options to choose from. So we developed one ourself. The design of the interface is highly inspired by muduo and Golang. Let's take some examples to explain this:
Duration
: This is a time interval class, with a time unit. It is referenced to the implementation ofDuration
of the Golang project. We have seen some many cases that the time interval without a unit. For example, what doestimeout
mean? Seconds, milliseconds or microseconds? We need to read the document carefully, even more, we need to read the implementation codes. OurDuration
class has self-explations with the time unit. Additionallystd::chrono::duration
in the STL of C++11 has the similar implementations, but it is a little bit complicated.Buffer
: This is a memory buffer class. It uses the advantages of the two projects muduo and Golang.http::Server
: This is a HTTP server class with a working threads pool. It is thread-safe to dispatch tasks- We simply use a string with the format of
"ip:port"
to represent a network address. This is referenced to the design of Golang. httpc::ConnPool
: This is HTTP client connection pool with highly performance. In the future we can add more features to this class : load balance and failover.
In addition, in the implementations we pay seriously attations to thread-safe problems. An event-related resource must be initialized and released in its own EventLoop
thread, so that we can minimize the possibility of thread-safe error. In order to achieve this goal we reimplemented event_add
andevent_del
and other functions. Each call to event_add
, we stored the resource into thread local storage, and in the call event_del
, we checked it whether it is stored in the thread local storage. And then we checked all the threads local storages to see whether there are resources not destructively released when the process was exiting. The detail codes are here https://github.com/Qihoo360/evpp/blob/master/evpp/inner_pre.cc#L36~L87. We are so harshly pursuit the thread safety to make a program can quietly exit or reload, because we have a deep understanding of "developing a system to run forever and developing a system to quietly exit after running a period of time are totally two different things".
Getting Started
Please see [Quick Start](docs/quick_start.md)
Benchmark
Benchmark Reports
[The IO Event performance benchmark against Boost.Asio](docs/benchmark_ioevent_performance_vs_asio.md) : evpp is higher than asio about 20%~50% in this case
[The ping-pong benchmark against Boost.Asio](docs/benchmark_ping_pong_spend_time_vs_asio.md) : evpp is higher than asio about 5%~20% in this case
[The throughput benchmark against libevent2](docs/benchmark_throughput_vs_libevent.md) : evpp is higher than libevent about 17%~130% in this case
[The throughput benchmark against Boost.Asio](docs/benchmark_throughput_vs_asio.md) : evpp and asio have the similar performance in this case
[The throughput benchmark against Boost.Asio(中文)](docs/benchmark_throughput_vs_asio_cn.md) : evpp and asio have the similar performance in this case
[The throughput benchmark against muduo(中文)](docs/benchmark_throughput_vs_muduo_cn.md) : evpp and muduo have the similar performance in this case
Throughput
The throughput benchmark of evpp is 17%~130% higher than libevent2 and similar with boost.asio and muduo. Although evpp is based on libevent, evpp has a better throughput benchmark than libevent. That's because evpp implements its own IO buffer instead of libevent's evbuffer.
Examples
An echo TCP server
#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,
evpp::Timestamp ts) {
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;
}
An echo HTTP server
#include <evpp/http/http_server.h>
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",
[](evpp::EventLoop* loop,
const evpp::http::ContextPtr& ctx,
const evpp::http::HTTPSendResponseCallback& cb) {
cb(ctx->body().ToString()); }
);
server.Init(ports);
server.Start();
while (!server.IsStopped()) {
usleep(1);
}
return 0;
}
An echo UDP server
#include <evpp/udp/udp_server.h>
#include <evpp/udp/udp_message.h>
int main(int argc, char* argv[]) {
std::vector<int> ports = { 1053, 5353 };
evpp::udp::Server server;
server.SetMessageHandler([](evpp::EventLoop* loop, evpp::udp::MessagePtr& msg) {
evpp::udp::SendMessage(msg);
});
server.Init(ports);
server.Start();
while (!server.IsStopped()) {
usleep(1);
}
return 0;
}
More examples
Please see the source code in examples
.
TODO
- An async redis client
- Add
zipkin
tracing support - Add examples : asio chat room
- Fix the comments written in mandarin problem
- Add benchmark against with boost.asio/cpp-netlib/beast http library/muduo/libevent/libuv ...
In Production
Welcome to join this list :-)
Thanks
Thanks for the support of Qihoo360.
Thanks for libevent, glog, gtest, Golang, LevelDB, rapidjson projects.
*Note that all licence references and agreements mentioned in the evpp README section above
are relevant to that project's source code only.