boost async_read_some 用法

async_read_some读到数据就会直接回调设置的函数,不管数据是否已经读完。所以在这里

会遇到一个非常棘手的问题,如何确定数据已经读取完毕?常见的方式是在数据的后面添加

标志位,例如添加/r/n/r/n作为结束符,然后停止读取

async_read_some的基本原理是往IOCP的队列里面添加一个异步任务,没有事情的时候,CSession::ContinueRead

不应该被调用

class CSession : public boost::enable_shared_from_this<CSession>

{

public:

CSession(boost::asio::io_service &io_service) : m_socket(io_service)

{

memset(m_szRecvBuffer, 0x00, 1024);

m_bStartRecv = false;

}

void Start()

{

static boost::asio::ip::tcp::no_delay option(true);

m_socket.set_option(option);

boost::function0<void> f = boost::bind(&CSession::StartThread, this);

boost::thread thrd(f);

}

/*

启动线程函数的根本原因是需要向客户端推送消息,而且在过程中需要等待接收消息

*/

void StartThread()

{

while (true)

{

/*

使用m_bStartRecv标志位主要是为了避免多次设置回调,当正在接收的时候,不需要设置回调

*/

if (!m_bStartRecv)

{

m_bStartRecv = true;

m_socket.async_read_some(boost::asio::buffer(m_szRecvBuffer),

boost::bind(&CSession::ContinueRead, shared_from_this(),

boost::asio::placeholders::error,

boost::asio::placeholders::bytes_transferred));

}

char szAlarm[32] = "alarm";

boost::system::error_code ec;

m_socket.send(boost::asio::buffer(szAlarm), 0, ec);

boost::this_thread::sleep_for(boost::chrono::milliseconds(3000));

if (ec) break;

}

}

private:

/*

在当前接收回调函数中,我们还继续设置了回调函数m_socket.async_read_some,避免仅仅是读取数据包的一部分,

在这里m_szRecvBuffer会一直作为接收的缓冲,而之前接收的数据也在里面,并且剩下的数据,会根据偏移量,填充到

m_szRecvBuffer的后面,bytes_transferred参数代表当前已经接收的数据

*/

void ContinueRead(const boost::system::error_code &error, std::size_t bytes_transferred)

{

if (error) return;

m_strMatch = m_strMatch + m_szRecvBuffer;

int index = m_strMatch.find("\r\n\r\n", 0);

if (-1 != index)

{

int ret = m_socket.send(boost::asio::buffer(m_szRecvBuffer));

std::cout << m_szRecvBuffer << std::endl;

m_bStartRecv = false;

return;

}

m_socket.async_read_some(boost::asio::buffer((m_szRecvBuffer)),

boost::bind(&CSession::ContinueRead, shared_from_this(),

boost::asio::placeholders::error,

boost::asio::placeholders::bytes_transferred));

}

private:

boost::asio::ip::tcp::socket m_socket;

char m_szRecvBuffer[1024];

std::string m_strMatch;

bool m_bStartRecv;

};

注意

当前的仅仅是一个例子,并没有考虑到客户端关闭连接,服务器线程及时退出

时间: 2024-08-23 02:53:52

boost async_read_some 用法的相关文章

boost::share_ptr用法

boost中提供了几种智能指针方法:scoped_ptr shared_ptr intrusive_ptr weak_ptr,而标准库中提供的智能指针为auto_ptr. 这其中,我最喜欢,使用最多的是shared_ptr,也最让人随心所欲. 使用很简单,如下: 头文件 <boost/shared_ptr.hpp> class A {   virtual void process(); } boost::shared_ptr<A> test(new A); boost::share

boost日期用法

// boost2.cpp : 定义控制台应用程序的入口点. //boost gregorian_date usage //made by davidsu33 2014-5-10 #include "stdafx.h" #include <boost/date_time/gregorian/greg_date.hpp> #include <boost/date_time/gregorian_calendar.hpp> #include <boost/dat

boost::any 用法

boost::any可以存放任何类型的C++类型,也可以是用户自定义的类型.非常方便,可以很方便的满足在运行过程中判断数据类型,从而进行相关的操作. 函数原型: // In header: <boost/any.hpp> class any { public: // construct/copy/destruct any(); any(const any &); template<typename ValueType> any(const ValueType &);

boost::thread用法

最近在做一个消息中间件里面涉及到多线程编程,由于跨平台的原因我采用了boost线程库.在创建线程时遇到了几种线程创建方式现总结如下: 首先看看boost::thread的构造函数吧,boost::thread有两个构造函数: (1)thread():构造一个表示当前执行线程的线程对象: (2)explicit thread(const boost::function0<void>& threadfunc):      boost::function0<void>可以简单看为

[转载] boost thread用法

原文: http://antonym.org/2009/05/threading-with-boost---part-i-creating-threads.html boost库中thread的用法官方文档写的不是特别清楚, 这篇文章给出了比较清晰的介绍和例子. Threading with Boost - Part I: Creating Threads May 13, 2009 Boost is an incredibly powerful collection of portable cl

boost::algorithm用法详解之字符串关系判断

http://blog.csdn.net/qingzai_/article/details/44417937 下面先列举几个常用的: #define i_end_with boost::iends_with#define i_start_with boost::istarts_with#define i_contain boost::icontains#define i_equal boost::iequals#define split boost::algorithm::split#defin

[转] boost::function用法详解

http://blog.csdn.net/benny5609/article/details/2324474 要开始使用 Boost.Function, 就要包含头文件 "boost/function.hpp", 或者某个带数字的版本,从 "boost/function/function0.hpp" 到 "boost/function/function10.hpp". 如果你知道你想保存在 function 中的函数的参数数量,这样做可以让编译器

Boost::split用法详解

工程中使用boost库:(设定vs2010环境)在Library files加上 D:\boost\boost_1_46_0\bin\vc10\lib在Include files加上 D:\boost\boost_1_46_0 1 // boostTest.cpp : 定义控制台应用程序的入口点. 2 #include "stdafx.h" 3 4 #include <iostream> 5 #include <boost/format.hpp> 6 #incl

boost::function用法详解

要开始使用 Boost.Function, 就要包含头文件 "boost/function.hpp", 或者某个带数字的版本,从 "boost/function/function0.hpp" 到 "boost/function/function10.hpp". 如果你知道你想保存在 function 中的函数的参数数量,这样做可以让编译器仅包含需要的头文件.如果包含 "boost/function.hpp", 那么就会把其它的