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++扫盲系列--第一个服务器程序

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

编写测试简单的服务器和客户端 (C++)(十一)

本教程介绍如何用 C++ 编写服务器 Service 和客户端 Client 节点。内容编写Service节点 代码 代码解释 编写Client节点 代码 代码解释 编...
  • zx3517288
  • zx3517288
  • 2017年06月09日 23:27
  • 345

【原创】C++编写高性能服务器:内存分配篇

    服务器程序有别于一般应用程序,安全与性能应被给予较高的待遇。在这里我们只讨论性能相关的问题。Apache是一款开源,安全及高性能的服务器,我经常把它放在各个档次的机器上进行测试,它总是能以较低...
  • lz78
  • lz78
  • 2005年09月23日 16:57
  • 3073

C++ 编写WebService服务

大家好,很久没有写相关的技术文章了,最近一直考虑一个问题,就是对于一个老C++程序员来说,后续路程如何走下去:该学写什么,了解写什么?想了想,突然注意到最近公司接到的客户需求:将监控行业相关数据以we...
  • lixiang987654321
  • lixiang987654321
  • 2016年03月19日 21:14
  • 4971

C++聊天程序源程序,有服务器和客户端(Visual studio C++源代码程序)

  • 2010年01月29日 14:23
  • 3.21MB
  • 下载

C++ 简单socket服务端实现代码

做个笔记,注释以基本在代码里,废话不多说  PS:欢迎批评、指正、交流 #include #include using namespace std; //因为是用codeblocks编写的...
  • Polumgla
  • Polumgla
  • 2018年01月15日 16:28
  • 40

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

C++ Socket服务器简单代码示例#include #include #pragma comment(lib,"ws2_32.lib")//服务器端 void main() { ...
  • HeroRazor
  • HeroRazor
  • 2015年06月12日 15:40
  • 1371

C++网络编程基础代码(服务器)---基于TCP协议

//网络编程服务器 /*服务器端编程的步骤: 1:加载套接字库,创建套接字(WSAStartup() / socket()); 2:绑定套接字到一个IP地址和一个端口上(bind()); 3:将...
  • u011207871
  • u011207871
  • 2017年02月17日 09:42
  • 448

C++QQ服务器端源代码 完整服务器代码

  • 2014年11月10日 14:58
  • 3.13MB
  • 下载

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

如果说答案是性能,那么肯定有人会满不在乎。觉得性能不够的话, 只要加机器就可以了。然而更少的机器,意味着更低的能耗,更少的硬件投入,更少的人力资源投入去维护机器。总而言之,更低的成本。 肯定会有人说...
  • a379039233
  • a379039233
  • 2015年09月15日 14:09
  • 5161
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:10行代码编写一个c++服务器
举报原因:
原因补充:

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