C++11网络编程
来源:互联网 发布:网络英语考试时间 编辑:程序博客网 时间:2024/06/10 00:05
Handy是一个简洁优雅的C++11网络库,适用于linux与Mac平台。十行代码即可完成一个完整的网络服务器。
下面是echo服务器的代码:
#include <handy/handy.h>using namespace std;using namespace handy;int main(int argc, const char* argv[]) { EventBase bases; //事件分发器 Signal::signal(SIGINT, [&]{ bases.exit(); }); //注册Ctrl+C的信号处理器--退出事件分发循环 TcpServer echo(&bases); //创建服务器 int r = echo.bind("", 99); //绑定端口 exitif(r, "bind failed %d %s", errno, strerror(errno)); echo.onConnRead([](const TcpConnPtr& con) { con->send(con->getInput()); // echo 读取的数据 }); bases.loop(); //进入事件分发循环}
其中EventBase是事件分发器,内部使用epoll/kqueue进行IO事件分发。
EventBase功能丰富,还包含了定时任务等功能。
网络编程中全异步处理请求的难度较高,特别是涉及业务逻辑,涉及数据库使用等情况。大家使用的最常见的模型是用异步处理IO,保证大的并发量,使用多线程处理业务请求,简化业务逻辑的编写。这种半同步半异步的编程模型我们简称为HSHA(half sync half async)。
Handy能够支持HSHA,下面是一个完整的服务器例子:
#include <handy/handy.h>using namespace std;using namespace handy;
int main(int argc, const char* argv[]) { EventBase base; HSHA hsha(&base, 4); //启动4个线程进行同步处理 int r = hsha.bind("", 99); exitif(r, "bind failed"); //注册Ctrl+C的信号处理 Signal::signal(SIGINT, [&]{ 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
http://www.cnblogs.com/dongfuye/p/4599278.html
- C#网络编程初探
- C#网络编程初探
- C#网络编程
- C#网络编程初探
- C#网络编程初探
- C/C++网络编程
- C#网络编程初探
- c 网络编程
- Linux c 网络编程
- c语言网络编程
- C 网络编程 socket
- java/c网络编程
- C语言网络编程
- c的网络编程
- C/C++网络编程
- Linux c 网络编程
- Linux C 网络编程
- Linux C 网络编程
- Hdu 2099之解题报告
- set -e
- Makfile wildcard:扩展通配符, notdir:去除路径, patsubst:替换通配符
- pip安装使用官方的源无法安装问题解决
- Android studio使用百度SDK
- C++11网络编程
- Day02-转义、常变量、printf和scanf、命名、驼峰标志、注释
- orcfile 与 parpuet 的压缩测试
- Geometry Looping in geometry networks 在几何网络中的几何循环
- JavaScript中的对象及层级关系、常用函数
- Day3-进制转换、位运算、三目运算符、switch、if
- 记一次驴唇不对马嘴的DIY之旅(四)
- 【跟我学spring 4.0 】之第一节-springhello 的创建
- BestCoder Round #67 (div.2)总结