Boost Asioserver使用
今天主要想说道说道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使用的更多相关文章
- boost强分类器的实现
boost.cpp文件下: bool CvCascadeBoost::train( const CvFeatureEvaluator* _featureEvaluator, int _numSampl ...
- Boost信号/槽signals2
信号槽是Qt框架中一个重要的部分,主要用来解耦一组互相协作的类,使用起来非常方便.项目中有同事引入了第三方的信号槽机制,其实Boost本身就有信号/槽,而且Boost的模块相对来说更稳定. signa ...
- 玩转Windows服务系列——使用Boost.Application快速构建Windows服务
玩转Windows服务系列——创建Windows服务一文中,介绍了如何快速使用VS构建一个Windows服务.Debug.Release版本的注册和卸载,及其原理和服务运行.停止流程浅析分别介绍了Wi ...
- boost::function的用法
本片文章主要介绍boost::function的用法. boost::function 就是一个函数的包装器(function wrapper),用来定义函数对象. 1. 介绍 Boost.Func ...
- Boost条件变量condition_variable_any
Boost条件变量可以用来实现线程同步,它必须与互斥量配合使用.使用条件变量实现生产者消费者的简单例子如下,需要注意的是cond_put.wait(lock)是在等待条件满足.如果条件不满足,则释放锁 ...
- 新手,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 ...
- boost.python笔记
boost.python笔记 标签: boost.python,python, C++ 简介 Boost.python是什么? 它是boost库的一部分,随boost一起安装,用来实现C++和Pyth ...
- vs2013给项目统一配置boost库
1.打开项目,然后点击菜单中的 视图->其他窗口->属性管理器 2. 打开属性管理器,点击项目前的箭头,展开项目,找到debug或者release下面的Microsoft.Cpp.Win3 ...
- 基于C/S架构的3D对战网络游戏C++框架_05搭建系统开发环境与Boost智能指针、内存池初步了解
本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): ...
随机推荐
- Pro ASP.NET Core MVC 第6版 第一章
目录 第一章 ASP.NET Core MVC 的前世今生 ASP.NET Core MVC 是一个微软公司开发的Web应用程序开发框架,它结合了MVC架构的高效性和简洁性,敏捷开发的思想和技术和.N ...
- MFC_2.9 使用变参函数
使用变参函数 #include <stdio.h>// 包含一个头文件,提供不定参数的宏#include <stdarg.h>// 用于输出不定数量的整数值void pri ...
- Linux的网卡由eth0变成了eth1或eth2,如何修复??
背景:做linux下分布式测试的时候,重新安装了两个linux虚拟机,结果分布式脚本没有做好,分布式也没有做成. 今天想练练linux命令,打开vmware,启动linux1 虚拟机,使用ifconf ...
- 虚拟机找不到本机vmnet0,vmnet8,无法连接xshell,解决方案
首先出现这个问题肯定是第一次下载虚拟机把之前的注册表覆盖了,网卡找不到,首先卸载VMware 并且将C\ProgramData下的VMware文件夹删除掉 ,下载cceaner,点击注册表清除干净,再 ...
- 【6.24校内test】T1 江城唱晚
[题目背景] 墙角那株海棠,是你种下的思念. 生死不能忘,高烛照容颜. 一曲江城唱晚,重忆当年坐灯前, 青衫中绣着你留下的线. ——银临<江城唱晚> [问题描述] 扶苏是个喜欢一边听古风歌 ...
- windows10下win+R快速打开程序
按下win+R进入运行窗口,输入应用程序名称按下回车键 即可打开该应用,若提示“windows找不到文件”,请看下一步 可以采用建立统一的目录管理,新建目录“F:/local/bin” 将新建目录的路 ...
- Java基础——面向对象(封装——继承——多态 )
对象 对象: 是类的实例(实现世界中 真 实存在的一切事物 可以称为对象) 类: 类是对象的抽象描述 步骤: 1.定义一个类 (用于 描述人:) ( * 人:有特征和行为) 2.根据类 创建对象 -- ...
- 访问请求参数request.getParameter()
访问请求参数request.getParameter() 制作人:全心全意 getParameter() 例: 传递参数页: <%@ page language="java" ...
- CCF201409-2 画图 java(100分)
试题编号: 201409-2 试题名称: 画图 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 在一个定义了直角坐标系的纸上,画一个(x1,y1)到(x2,y2)的矩形指将横坐 ...
- (六)python3 字符串常用方法
字符串截取 >>>s = 'hello' >>>s[0:3] 'he' >>>s[:] #截取全部字符 'hello' 消除空格及特殊符号 ...