今天主要想说道说道boost里面的网络通信库怎样设计和使用,由于近期一直在和网络一起工作,大数据处理和机器学习都离不开最后使用网络进行上线部署。先看看所有的源码吧。

#include <cstdlib>
#include <iostream>
#include <memory>
#include <utility>
#include <boost/asio.hpp>
#include <stdint.h>
#include "data.h"
#include <ostream>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/archive/binary_oarchive.hpp> using boost::asio::ip::tcp; class session
: public std::enable_shared_from_this < session >
{
public:
session(boost::asio::ip::tcp::socket socket)
: socket_(std::move(socket))
{
} void start()
{
do_read();
} private:
void do_read()
{
auto self(shared_from_this()); //int32_t data_length;
boost::asio::async_read(socket_,
boost::asio::buffer(&data_length, 4),
[this, self](boost::system::error_code ec, std::size_t length)
{
if (!ec)
{
do_read_body();
}
});
}
void do_read_body()
{ auto self(shared_from_this());
boost::asio::async_read(socket_,
buf_, boost::asio::transfer_exactly(data_length),
[this, self](boost::system::error_code ec, std::size_t length)
{
std::cout << length<<std::endl;
if (!ec)
{
ProcessMessage();
do_read();
}
else
{
std::cout << "error" << std::endl;
}
});
}; void ProcessMessage()
{
boost::archive::binary_iarchive ia(buf_);
translate_data message;
ia >> message;
std::cout << message.width<<std::endl;
}; int32_t data_length; boost::asio::ip::tcp::socket socket_; boost::asio::streambuf buf_;
}; class server
{
public:
server(boost::asio::io_service& io_service, short port)
: acceptor_(io_service, boost::asio::ip::tcp::endpoint(tcp::v4(), port)),
socket_(io_service)
{
do_accept();
} private:
void do_accept()
{
acceptor_.async_accept(socket_,
[this](boost::system::error_code ec)
{
if (!ec)
{
std::make_shared<session>(std::move(socket_))->start();
} do_accept();
});
} boost::asio::ip::tcp::acceptor acceptor_;
boost::asio::ip::tcp::socket socket_;
}; int main(int argc, char* argv[])
{
try
{
/*if (argc != 2)
{
std::cerr << "Usage: async_tcp_echo_server <port>\n";
return 1;
}*/ boost::asio::io_service io_service; server s(io_service, 8888); io_service.run();
}
catch (std::exception& e)
{
std::cerr << "Exception: " << e.what() << "\n";
} return 0;
}

这个就是服务区的所有源码。

data是消息的数据格式,translate_data 这个类的定义,该类能够使用boost进行序列化。整个消息处理起来很的流畅,能够使得我们仅仅关心数据流,而忽略server怎样异步接收消息。当然我的演示样例代码中的数据格式很之简单,数据包开头的int表示数据有多少个字节。索性连我的消息代码一起放出来:

#include <boost/serialization/array.hpp>
#include <boost/serialization/vector.hpp> struct MeasurementZ
{
double m_a[3];
double m_w[3];
double m_t;
friend class boost::serialization::access; template<class Archive>
void serialize(Archive& ar, const unsigned int version)
{
ar & boost::serialization::make_array(m_a, 3 * sizeof(double));
ar & boost::serialization::make_array(m_w, 3 * sizeof(double));
ar & m_t;
}
}; struct translate_data
{
int width;
int height;
double mt;
int N;
unsigned char* buffer;//640*480; std::vector<MeasurementZ> z;
std::vector<double> Quaterniond;//4
std::vector<double> Vector3d;//3
double M_rM_t;
};
BOOST_SERIALIZATION_SPLIT_FREE(translate_data)
namespace boost
{
namespace serialization
{
/** Serialization support for cv::Mat */
template<class Archive>
void save(Archive & ar, const translate_data& m, const unsigned int version)
{
ar & m.width;
ar & m.height;
ar & m.mt;
ar & m.N; const size_t data_size = m.width * m.height*sizeof(unsigned char);
ar & boost::serialization::make_array(m.buffer, data_size);
ar & m.z;
ar & m.Quaterniond;
ar & m.Vector3d;
ar & m.M_rM_t;
} /** Serialization support for cv::Mat */
template <class Archive>
void load(Archive & ar, translate_data& m, const unsigned int version)
{
ar & m.width;
ar & m.height;
ar & m.mt;
ar & m.N; const size_t data_size = m.width * m.height*sizeof(unsigned char);
m.buffer = new unsigned char[m.width*m.height];
ar & boost::serialization::make_array(m.buffer, data_size);
ar & m.z;
ar & m.Quaterniond;
ar & m.Vector3d;
ar & m.M_rM_t;
}
}
};

整个project很easy,请有用c++11标准来完毕。

Boost Asioserver使用的更多相关文章

  1. boost强分类器的实现

    boost.cpp文件下: bool CvCascadeBoost::train( const CvFeatureEvaluator* _featureEvaluator, int _numSampl ...

  2. Boost信号/槽signals2

    信号槽是Qt框架中一个重要的部分,主要用来解耦一组互相协作的类,使用起来非常方便.项目中有同事引入了第三方的信号槽机制,其实Boost本身就有信号/槽,而且Boost的模块相对来说更稳定. signa ...

  3. 玩转Windows服务系列——使用Boost.Application快速构建Windows服务

    玩转Windows服务系列——创建Windows服务一文中,介绍了如何快速使用VS构建一个Windows服务.Debug.Release版本的注册和卸载,及其原理和服务运行.停止流程浅析分别介绍了Wi ...

  4. boost::function的用法

    本片文章主要介绍boost::function的用法. boost::function 就是一个函数的包装器(function wrapper),用来定义函数对象. 1.  介绍 Boost.Func ...

  5. Boost条件变量condition_variable_any

    Boost条件变量可以用来实现线程同步,它必须与互斥量配合使用.使用条件变量实现生产者消费者的简单例子如下,需要注意的是cond_put.wait(lock)是在等待条件满足.如果条件不满足,则释放锁 ...

  6. 新手,Visual Studio 2015 配置Boost库,如何编译和选择,遇到无法打开文件“libboost_thread-vc140-mt-gd-1_63.lib“的解决办法

    1,到官网下载最新的boost,www.boost.org 这里我下载的1-63版本. 2,安装,解压后运行bootstrap.bat文件.稍等一小会就OK. 3,编译boost库.注意一定要使用VS ...

  7. boost.python笔记

    boost.python笔记 标签: boost.python,python, C++ 简介 Boost.python是什么? 它是boost库的一部分,随boost一起安装,用来实现C++和Pyth ...

  8. vs2013给项目统一配置boost库

    1.打开项目,然后点击菜单中的 视图->其他窗口->属性管理器 2. 打开属性管理器,点击项目前的箭头,展开项目,找到debug或者release下面的Microsoft.Cpp.Win3 ...

  9. 基于C/S架构的3D对战网络游戏C++框架 _05搭建系统开发环境与Boost智能指针、内存池初步了解

    本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): ...

随机推荐

  1. Mysql5.7多源复制,过滤复制一段时间后增加复制一个库的实现方法

    多源复制如果是整个实例级别的复制,那不存在下面描述的情况. 如果是对其中一个或多个主实例都是过滤复制,并且运行一段时间后,想在这个源上再增加一个库怎么实现?   主1:192.168.1.10 330 ...

  2. SqlBulkCopy实现大批量数据导入

    //自增列重新生成:SqlBulkCopy bc = new SqlBulkCopy(conn) //自增列保留原值:SqlBulkCopy bc = new SqlBulkCopy(conn,Sql ...

  3. GC策略

           JVM里的GC(Garbage Collection)的算法有很多种,如标记清除收集器,压缩收集器,分代收集器等等,详见HotSpot VM GC 的种类 现在比较常用的是分代收集(ge ...

  4. 计算机网络(四)--全世界最好的TCP基础知识讲解

    TCP传输的数据单元是报文段,报文段分为首部.数据两部分 TCP首部 首部的前20字节是固定长度,后面的4n字节根据需要增加的选项 字段解释:图中标示单位为bit,不是byte 1.源端口.目的端口: ...

  5. contab的使用方法

    linux 系统则是由 cron (crond) 这个系统服务来控制的.Linux 系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的.另 外, 由于使用者自己也可以设置计划任务,所以, ...

  6. JAVA基础——IO流字节流

    在Java中把不同的输入输出源(键盘.文件.网路连接)抽象表述为“流”. 1.输入流.输出流 .字节输入流通过FileInputStream和来操作 字节输出流通过FileOutputStream来操 ...

  7. ListView常用属性 (2012-01-12 17:20:27)

    比较特别的属性,通过设置这样的属性可以做出更加美观的列表.stackFromBottom——设置该属性之后你最新条目就会显示你列表的最下面,值为true和false,如android:stackFro ...

  8. Cash Machine POJ - 1276

    解法 多重背包板子题 多重背包板子 如果上限的体积大于了给定的体积那么套完全背包 否则二进制优化成01背包 代码 #include <iostream> #include <cstr ...

  9. 洛谷 P1280 尼克的任务 (线性DP)

    题意概括 线性资源分配的问题,因为空闲的时间大小看后面的时间(反正感觉这个就是个套路)所以从后往前DP. 转移方程 如果当前时刻没有工作 f[i]=f[i+1]+1 如果当前时刻有工作 f[i]=ma ...

  10. mysql运维常用

    一.用户授权 用户授权主要指: 1.可以限制用户访问那些库.表 2.可以限制用户对库.表执行select.create.delete.alter.drop等操作 3.可以限制用户登陆的IP.IP段.或 ...