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

来源:互联网 发布:个性淘宝店男装铺名 编辑:程序博客网 时间:2024/06/05 04:16
 

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

分类: program 架构 523人阅读 评论(3) 收藏 举报
网络编程高性能c++tornado

目录(?)[+]

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 11181Trying 127.0.0.1...Connected to 127.0.0.1.Escape character is '^]'.hello worldhello 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/abcreturn: 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以上。

对于如何设

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 四个月的孩子拉肚子怎么办 4个月孩子拉肚子怎么办 三阳的房子很热怎么办 买了缺角的房子怎么办 多肉摇钱树焉了怎么办 虎皮兰叶子烂了怎么办 三角龙骨烂根了怎么办 地板木龙骨会动怎么办 多肉植物开花后怎么办 春峰之辉烂了怎么办 仙人指不开花是怎么办 大门开在破财位怎么办 人走霉运的时候怎么办 pp助手刷机失败怎么办 别人骂我很难听怎么办 被骂了心里不爽怎么办 被别人扎小人了怎么办 人要倒霉的时候怎么办 属虎的请了貔貅怎么办 我的护身符丢了怎么办 地漏被头发堵了怎么办 淋浴房地漏堵了怎么办 冰箱对着卧室门怎么办 冰箱离灶台太近怎么办 风水财位对着门怎么办 一进大门是厕所怎么办 大门和厕所正对怎么办 房子靠马路很吵怎么办 入户门对着楼梯怎么办 买房买了18楼怎么办 加个房间,没窗户怎么办 厨房窗户对着路怎么办 卧室门正对窗户怎么办 在路上车抛锚了怎么办 村里欠个人的钱怎么办 房子在路边太吵怎么办 楼正对小区大门怎么办 买了朝北的房子怎么办 转运竹的根发黄怎么办 婴儿让蚊子咬了怎么办 床的侧面有镜子怎么办