发布一个参考tornado的高性能c++网络库:libtnet

转载 2013年12月05日 14:27:32
 

发布一个参考tornado的高性能c++网络库:libtnet

分类: program 架构 523人阅读 评论(3) 收藏 举报

目录(?)[+]

libtnet是一个用c++编写的高性能网络库,它在设计上面主要参考tornado,为服务端网络编程提供简洁而高效的接口,非常易于使用。

Echo Server

void onConnEvent(const ConnectionPtr_t& conn, ConnEvent event, const void* context)
{
    switch(event)
    {
        case Conn_ReadEvent:
            {
                const StackBuffer* buffer = static_cast<const StackBuffer*>(context);
                conn->send(string(buffer->buffer, buffer->count));
            }
            break;
        default:
            break;
    }    
}

int main()
{
    TcpServer s;
    s.listen(Address(11181), std::bind(&onConnEvent, _1, _2, _3));

    s.start();

    return 0;
}

当程序启动,服务监听本地11181端口,我们使用telnet测试:

root@tnet:~# telnet 127.0.0.1 11181
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
hello world
hello world

可以看到,libtnet在使用上面非常简单,在listen的时候,指定一个回调函数,当有新的连接到来的时候,该回调函数就会与该connection进行绑定,这样该connection的任何事件都能通过回调进行处理。

在上面那个例子中,我们只关心了connection的ReadEvent,也就是读事件,然后将读取到的所有数据原封不动的转发回去。

Http Server

void onHandler(const HttpConnectionPtr_t& conn, const HttpRequest& request)
{
    HttpResponse resp;
    resp.statusCode = 200;
    resp.body.append("Hello World");

    conn->send(resp);
}

int main()
{
    TcpServer s;
    HttpServer httpd(&s);   
    httpd.setHttpCallback("/abc", std::bind(&onHandler, _1, _2));

    httpd.listen(Address(11181));    
    s.start(4);

    return 0;
} 

当server启动,程序使用本机11181端口提供http服务。我们使用curl测试。

curl http://127.0.0.1:11181/abc

return: hello world

可以看到,使用http server也非常简单,我们只需要对相应的路径绑定一个callback回调,当有请求发生的时候,对应的callback执行。

使用benchmark测试,发现性能也不错RPS能到16000+,在512MB,单核CPU下面进行ab压测,具体可以参考benchmark

Webscoket Server

void onWsCallback(const WsConnectionPtr_t& conn, WsEvent event, const void* context)
{
    switch(event)
    {
        case Ws_MessageEvent:
            {
                const string& str = *(const string*)context;
                conn->send("hello " + str);
            }
            break;
        default:
            break;
    }
}

int main()
{
    TcpServer s;

    HttpServer httpd(&s);

    httpd.setWsCallback("/push/ws", std::bind(&onWsCallback, _1, _2, _3));    

    httpd.listen(Address(11181));

    s.start();

    return 0; 
}

libtnet同样提供了websocket RFC6455的支持,使用方法同http server,只需要对相应的path注册特定的回调,就可以很方便的进行websocket交互。

Client

libtnet不光提供了server层面的相关功能,同时也集成了http clientwebsocket client以及redis client。使得libtnet也能方便的进行客户端网络功能的开发。对于具体的使用,可以参考example

设计上面的考量

libtnet只支持linux版本,虽然做一个跨平台的通用库是一件吸引力非常大的事情,但是综合考虑之后,我决定只做linux版本的,主要有以下几个原因:

  • Linux下面使用prefork + epoll是一种非常高效的网络编程模型,性能强悍,实现简单。虽然unix下面有kqueue,windows下面有IOCP,但是没必要为了适配所有得操作系统将代码写的复杂。
  • Linux在系统层面上面就提供了很多高性能的函数,譬如timerfd,eventfd等,不光性能提升,同时也简化了很多代码实现。
  • Linux在服务器编程领域的使用率很高,专门做精一个平台就够了。

因为高性能的网络编程通常都是使用异步的编程方式,所以经常可以看到代码被异步拆的特别分散,不利于编写。所以我在libtnet里面大量的使用了c++ bind以及shared_ptr技术,用来模拟函数闭包,以及解决对象生命周期管理问题,简化代码的编写。并且我也使用了c++ 0x相关技术,gcc的版本至少要在4.4以上。

对于如何设

发布一个高性能的Reactor模式的C++网络库:evpp

发布一个高性能的Reactor模式的C++网络库。evpp是一个基于libevent开发的现代化的支持C++11特性的高性能网络库,自带TCP/UDP/HTTP等协议的异步非阻塞式的服务器和客户端库。...
  • zieckey
  • zieckey
  • 2017年03月19日 22:50
  • 2430

开源C/C++网络库比较

在开源的C/C++网络库中, 常用的就那么几个, 在业界知名度最高的, 应该是ACE了, 不过是个重量级的大家伙, 轻量级的有libevent, libev, 还有 Boost的ASIO。 ACE是...

值得推荐的C/C++框架和库 (真的很强大)

值得学习的C语言开源项目 - 1. Webbench Webbench是一个在linux下使用的非常简单的网站压测工具。它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作...

用C++实现HTTP服务器 - Windows平台(开放源代码)

用C++实现HTTP服务器 - Windows平台 软件名: Que's HTTP Server  (点击下载最新版含源代码) 作者: 阙荣文 - Que's C++ Studio    版权说明: ...
  • querw
  • querw
  • 2011年07月08日 17:19
  • 57421

libnet编译,windows/Linux

Linux下 1.下载安装包libnet-1.2-rc2.tar.gz  http://sourceforge.net/projects/libnet-dev/  2.解压缩libnet-1.2-r...

C++ 高性能服务器网络框架设计细节

GitChat 作者:范蠡 这篇文章我们将介绍服务器的开发,并从多个方面探究如何开发一款高性能高并发的服务器程序。需要注意的是一般大型服务器,其复杂程度在于其业务,而不是在于其代码工程的基本框架。大...
  • GitChat
  • GitChat
  • 2017年10月12日 15:48
  • 3166

tornado实现高性能无阻塞udp通信(1)——server端实现

在高性能web架构中,往往需要在多个组件之间进行通信
  • hmaimi
  • hmaimi
  • 2014年01月29日 20:21
  • 3002

怎么样编写高性能的C++程序

良好的代码风格是编写高性能程序的技术,下面是本人在做程序性能提高工作中总结的几点小知识,希望与大家一起分享:在文件或函数的头部定义变量,虽然C++可以随意定义变量,但头部定义变量有两点好处:首先便于阅...
  • windcsn
  • windcsn
  • 2005年07月19日 10:02
  • 1662

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

c++ 利用 chilkat 库发送 html邮件

转载请注明出处:!谢谢! 先简单介绍一下chilkat库,chikat是由一家芝加哥公司开发的商业组件,功能比较齐全,详细介绍可以到官网自行阅读不是外发产品还是可以用的,chilkat支持多个平台、语...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:发布一个参考tornado的高性能c++网络库:libtnet
举报原因:
原因补充:

(最多只允许输入30个字)