1 Star 0 Fork 0

lol / uv-cpp

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
MIT

uv-cpp

Github release Platform License Project Status: Active – The project has reached a stable, usable state and is being actively developed.


基于libuv实现的C++11风格网络库。接口简洁,性能优越,做过业务压测,稳定线上运行。正确使用接口情况下,未发现core dump或内存泄漏。

依赖项

特性


  • C++11风格回调函数:非C语言函数回调,支持非静态类成员函数及lambda。
  • TCP及UDP相关类封装:TcpServerTcpClientTcpConnectionTcpAcceptUdp
  • DNSHttp:DNS查询及HTTP协议支持,基于Radix Tree支持通配符等HTTP SEVER路由机制。
  • TimerTimerWheel:定时器及时间复杂度为O(1)的心跳超时踢出机制。
  • Async:异步机制封装。相对于原生libuv async接口,优化了调用多次可能只运行一次的问题(特性)。由于libuv几乎所有api都非线程安全,建议使用writeInLoop接口代替直接write(writeInLoop会检查当前调用的线程,如果在loop线程中调用则直接write,否则把write加到loop线程中执行)。
  • libuv信号封装。
  • PacketPacketBuffer:包与缓存,发送/接受包,用于从TCP字节流解析协议包。由ListBuffer和CycleBuffer两种实现(前者空间友好,后者时间友好)。提供默认Packet消息协议,也可实现自定义任意消息协议(参考uvnsq实现NSQ消息协议)。
  • Log日志输出接口,可绑定至自定义Log库。

编译

  • VS2017 (windows)
  • Codeblocks (linux)
  • CMake (linux)

基准测试

ping-pong VS boost.asio 1.67


环境:Intel Core i5 8265U + debian8 + gcc8.3.0 + libuv1.30.0 + '-O2'优化

包大小 1K bytes 2K bytes 4K bytes 8K bytes
uv-cpp 16138 kbyte 32071 kbyte 59264 kbyte 123813 kbyte
boost.asio 16119 kbyte 31566 kbyte 58322 kbyte 126210 kbyte

asio1


环境:i5-8265U + 4G内存 + 4k字节ping-pong

并发数 10 100 1000 5000
uv-cpp 654282 kbyte 591869 kbyte 401500 kbyte 412855 kbyte
boost.asio 633818 kbyte 585716 kbyte 371386 kbyte 382402 kbyte

asio2

Apache bench VS nginx 1.14.2


环境:Intel Core i5 8265U + debian8 + gcc8.3.0 + libuv1.30.0 + '-O2'
1000 并发 && 100000 次请求和nginx对比。 uv_http nginx_http

例程

十行代码实现简单echo服务

#include <iostream>
#include <uv/include/uv11.h>

int main(int argc, char** args)
{
    uv::EventLoop* loop = uv::EventLoop::DefaultLoop();
	
    uv::TcpServer server(loop);
    server.setMessageCallback([](uv::TcpConnectionPtr ptr,const char* data, ssize_t size)
    {
        ptr->write(data, size, nullptr);
    });
    //server.setTimeout(60); //heartbeat timeout.
	
    uv::SocketAddr addr("0.0.0.0", 10005, uv::SocketAddr::Ipv4);
    server.bindAndListen(addr);
    loop->run();
}

简单的http服务器,基于Radix Tree实现的路由机制,支持通配符、设置参数。

int main(int argc, char** args)
{
    uv::EventLoop loop;
    uv::http::HttpServer::SetBufferMode(uv::GlobalConfig::BufferMode::CycleBuffer);

    uv::http::HttpServer server(&loop);
	
    //example:  127.0.0.1:10010/test
    server.Get("/test",std::bind(&func1,std::placeholders::_1,std::placeholders::_2));
    
    //example:  127.0.0.1:10010/some123abc
    server.Get("/some*",std::bind(&func2, std::placeholders::_1, std::placeholders::_2));
    
    //example:  127.0.0.1:10010/value:1234
    server.Get("/value:",std::bind(&func3, std::placeholders::_1, std::placeholders::_2));
    
    //example:  127.0.0.1:10010/sum?param1=100&param2=23
    server.Get("/sum",std::bind(&func4, std::placeholders::_1, std::placeholders::_2));
    
    uv::SocketAddr addr("127.0.0.1", 10010);
    server.bindAndListen(addr);
    loop.run();
}

更多的例程 here.



!对于诸如uv::Timer,uv::TcpClient等对象的释放需要调用close接口并在回调函数中释放对象,否则可能会出错。
!切勿在Loop线程外创建注册该Loop下的事件相关对象(uv::TcpClientuv::TcpServeruv::Timer……),建议每个Loop都绑定独立线程运行。
一点微小的工作。

MIT License Copyright (c) 2018 莫失莫忘 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

简介

暂无描述 展开 收起
MIT
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
1
https://gitee.com/wcp_code/uv-cpp.git
git@gitee.com:wcp_code/uv-cpp.git
wcp_code
uv-cpp
uv-cpp
master

搜索帮助