10行代码编写一个c++服务器

原创 2015年07月07日 10:29:25
Handy是一个简洁优雅的C++11网络库,适用于linux与Mac平台。十行代码即可完成一个完整的网络服务器。


下面是echo服务器的代码:


#include <handy/handy.h>
using namespace handy;


int main(int argc, const char* argv[]) {
    EventBase base;
    Signal::signal(SIGINT, [&]{ base.exit(); });
    TcpServerPtr svr = TcpServer::startServer(&base, "", 99);
    exitif(svr == NULL, "start tcp server failed");
    svr->onConnRead([](const TcpConnPtr& con) {
        con->send(con->getInput());
    });
    base.loop();
}


其中EventBase是事件分发器,内部使用epoll/kqueue进行IO事件分发。

EventBase功能丰富,还包含了定时任务等功能。

网络编程中全异步处理请求的难度较高,特别是涉及业务逻辑,涉及数据库使用等情况。大家使用的最常见的模型是用异步处理IO,保证大的并发量,使用多线程处理业务请求,简化业务逻辑的编写。这种半同步半异步的编程模型我们简称为HSHA(half sync half async)。

Handy能够支持HSHA,下面是一个完整的服务器例子:

#include <handy/handy.h>
using namespace handy; 

int main(int argc, const char* argv[]) {
    EventBase base;
    HSHAPtr hsha = HSHA::startServer(&base, "", 99, 4); //启动4个线程进行同步处理
    exitif(!hsha, "hsha startServer failed");
   //注册Ctrl+C的信号处理
    Signal::signal(SIGINT, [&, hsha]{ base.exit(); hsha->exit(); signal(SIGINT, SIG_DFL);});

   // 消息处理函数
    hsha->onMsg(new LineCodec, [](const TcpConnPtr& con, const string& input){
        int ms = rand() % 1000;
        info("processing a msg");
        usleep(ms * 1000);
        return util::format("%s used %d ms", input.c_str(), ms);
    });
    base.loop();
}

其中onMsg注册消息处理函数,onMsg的第一个参数为消息解码器,该解码器把tcp连接的输入字节流解码为一个个消息,对每个完整的消息调用onMsg传入的第二个cb参数。

cb参数的原型为string cb (const TcpConnPtr& con, const string& input),用户只需要编写这个cb函数,处理输入,返回处理结果即可。cb函数在线程池中调用,因此处理函数中的sleep等操作不会堵塞网络IO。上述例子中,用户可以使用telnet登陆到这个hsha例子服务器上,发送消息给服务器,服务器端的日志里可以发现输出‘processing a msg’的线程并非IO线程。

如果用户需要更加灵活的处理,可以返回空字符串表示未处理完,可以直接操作con这个连接。

Handy还具备更多的功能,如定时处理,清理空闲连接等等,详情参见https://github.com/yedf/handy

C++ Socket服务器简单代码示例

C++ Socket服务器简单代码示例#include #include #pragma comment(lib,"ws2_32.lib")//服务器端 void main() { ...

Delphi7高级应用开发随书源码

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

为什么要用C++编写服务端程序?

如果说答案是性能,那么肯定有人会满不在乎。觉得性能不够的话, 只要加机器就可以了。然而更少的机器,意味着更低的能耗,更少的硬件投入,更少的人力资源投入去维护机器。总而言之,更低的成本。 肯定会有人说...

Delphi7高级应用开发随书源码

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

C++扫盲系列--第一个服务器程序

转自:http://blog.chinaunix.net/uid-22273897-id-393650.html 经过了近一个星期的反复纠结,今天要对于我的第一个服务器程序做一个小节。区区三百多...

Delphi7高级应用开发随书源码

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

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

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

C++基于TCP/IP简单的客户端、服务器通信程序实例

本篇文章实现了一个基于TCP 的

REST Datasnap服务端与javascript客户端实现

快速实现一个REST服务端和一个javascript客户端。

Delphi编写系统服务七:完成端口演示

 在开发大量Socket并发服务器,完成端口加重叠I/O是迄今为止最好的一种解决方案,下面是简单的介绍:   “完成端口”模型是迄今为止最为复杂的一种I/O模型,特别适合需要同时管理为数众多的套接字,...
  • Bear_hx
  • Bear_hx
  • 2008年11月28日 17:07
  • 2842
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:10行代码编写一个c++服务器
举报原因:
原因补充:

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