socket通信框架——boost asio
boost asio是一个封装了基本socket的跨平台通信框架。它支持异步访问,并支持tcp的自动封闭控制等操作。
一个简单的通信协议可以为:
| header | body |
| body长 | 数据 |
通过boost::asio接收的话,即可为:
void receive_header()
{
auto keep_alive(shared_from_this());
auto asbuf = boost::asio::buffer(msg->header(), msg->header_length());
auto on_header_received = [this, keep_alive]
(boost::system::error_code ec, std::size_t length)
{
if (!ec && buffer->decode_header())
{
receive_body();
}
}; boost::asio::async_read(socket_id, asbuf, on_header_received);
} void receive_body()
{
auto keep_alive(shared_from_this());
auto asbuf = boost::asio::buffer(msg->body(), msg->body_length());
auto on_body_received = [this, keep_alive]
(boost::system::error_code ec, std::size_t length)
{
if (!ecode && msg->body_length())
{
// do something
}
receive_header();
} boost::asio::async_read(socket_id, asbuf, on_body_received);
}
而一个简单的发送数据端可为:
void send(Message msg)
{
boost::system::error_code ec;
std::uint32_t posted = 0;
std::uint32_t rest = msg.length(); msg.encode_header(); do
{
auto asbuf = boost::asio::buffer(msg.data() + posted, rest);
posted = _socket.write_some(asbuf, ec);
if (ec)
{
break;
}
rest -= posted;
} while (rest > 0);
}
资料参考:
https://www.cnblogs.com/fnlingnzb-learner/p/10408812.html
socket通信框架——boost asio的更多相关文章
- 客户端技术的一点思考(数据存储用SQLite, XMPP通讯用Gloox, Web交互用LibCurl, 数据打包用Protocol Buffer, socket通讯用boost asio)
今天看到CSDN上这么一篇< 彻底放弃没落的MFC,对新人的忠告!>, 作为一个一直在Windows上搞客户端开发的C++程序员,几年前也有过类似的隐忧(参见 落伍的感觉), 现在却有一些 ...
- AgileEAS.NET SOA 中间件平台.Net Socket通信框架-介绍
一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...
- AgileEAS.NET SOA 中间件平台.Net Socket通信框架-简单例子-实现简单的服务端客户端消息应答
一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台Socket/Tcp通信框架介绍一文之中我们对AgileEAS.NET SOA ...
- AgileEAS.NET SOA 中间件平台.Net Socket通信框架-完整应用例子-在线聊天室系统-下载配置
一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台Socket/Tcp通信框架介绍一文之中我们对AgileEAS.NET SOA ...
- 使用 boost.asio 简单实现 异步Socket 通信
客户端: class IPCClient { public: IPCClient(); ~IPCClient(); bool run(); private: bool connect(); bool ...
- boost::asio译文
Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENS ...
- Boost.Asio技术文档
Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENSE_1_ ...
- BOOST.Asio——Overview
=================================版权声明================================= 版权声明:原创文章 谢绝转载 啥说的,鄙视那些无视版权随 ...
- #include <boost/asio.hpp>
TCP服务端和客户端 TCP服务端 #include <iostream> #include <stdlib.h> #include <boost/asio.hpp> ...
随机推荐
- Spark DataSource Option 参数
Spark DataSource Option 参数 1.parquet 2.orc 3.csv 4.text 5.jdbc 6.libsvm 7.image 8.json 9.xml 9.1读选项 ...
- IP路由__动态路由
1.使用协议来查找网络并更新路由表的配置,就是动态路由.它比使用静态或默认路由方便,但它需要一定的路由器CPU处理时间和网络链接带宽.路由协议定义了路由器与相邻路由器通信时所使用的一组规则. 在互联网 ...
- Java基本类型的内存分配在栈还是堆
我们都知道在Java里面new出来的对象都是在堆上分配空间存储的,但是针对基本类型却有所区别,基本类型可以分配在栈上,也可以分配在堆上,这是为什么? 在这之前,我们先看下Java的基本类型8种分别是: ...
- UI自动化实战进阶PO设计模式
前言 经过前面的实战我们已经编写了几个测试用例,下面我们要用PO设计模式来调整我们的代码,让页面元素和测试业务进行分离,这样看起来直观而且后期的维护也方便. python有一个第三方的PO设计的库,既 ...
- 基于C#/Winform实现的Win8MetroLoading动画
非常喜欢Metro风格的界面,所以想模仿一下一些UI效果的实现,网上找到了很多,但都是CSS3,WPF等实现,对于XAML和CSS3一窍不通,无奈下只有自己开始写. 下面是源码: 1 using Sy ...
- Linux 防火墙相关操作
目录 1.查看防火墙状态 2.部署防火墙 3.常用操作 4.其他操作 1.查看防火墙状态 systemctl status firewalld 绿字部分 Active:active(running) ...
- java——接口、多态性、对象转型
接口定义: 默认方法: 默认方法的作用: 如果在你的接口已经投入使用了,这个时候你想要在接口里面加一个方法,这个时候如果你加一个抽象方法的话,所有实现类都要改变源代码(因为实现类要把接口中的所有抽象 ...
- 如何安装Gephi工具
gephi中文版是一款开源免费跨平台基于JVM的复杂网络分析软件,安装后需要安装Java jdk API,否则就会出现gephi打不开的情况 该工具主要用于各种网络和复杂系统,动态和分层图的交互可视化 ...
- SPI/QSPI通信协议详解和应用
SPi是高速全双工的串行总线,通常应用在通讯速率较高的场合. SS:从设备选择信号线,也称片选信号线 每个从设备都有一个独立的SS信号线,信号线独占主机的一个引脚,及有多少个从设备就有多少个片选信号线 ...
- OpenStack Train版-2.安装keystone身份认证服务
安装 keystone 认证 mysql -uroot create database keystone; grant all privileges on keystone.* to 'keyston ...