博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
boost库在工作(32)网络服务端之二
阅读量:4162 次
发布时间:2019-05-26

本文共 2609 字,大约阅读时间需要 8 分钟。

下面来仔细地看连接处理的代码,如下:
//封装一个服务端类来处理网络。class CConnect : 	public boost::enable_shared_from_this< CConnect >{	static const int MAX_BUFSIZE = 1024;public:	CConnect(boost::asio::io_service& ioService)		:m_Socket(ioService),		m_strHit("\r\nResp: ")	{	}	boost::asio::ip::tcp::socket& GetSocket(void)	{		return m_Socket;	}	void Start(void)	{		m_Socket.async_read_some(boost::asio::buffer(m_chBuffer, MAX_BUFSIZE),			boost::bind(&CConnect::HandleRead, shared_from_this(),			boost::asio::placeholders::error,			boost::asio::placeholders::bytes_transferred));	}	void HandleRead(const boost::system::error_code& error,		size_t bytes_transferred)	{		if (!error)		{			boost::asio::async_write(m_Socket,				boost::asio::buffer(m_strHit),				boost::bind(&CConnect::HandleWrite, shared_from_this(),				boost::asio::placeholders::error));			boost::asio::async_write(m_Socket,				boost::asio::buffer(m_chBuffer, bytes_transferred),				boost::bind(&CConnect::HandleWrite, shared_from_this(),				boost::asio::placeholders::error));		}	}	void HandleWrite(const boost::system::error_code& error)	{		if (!error)		{			m_Socket.async_read_some(boost::asio::buffer(m_chBuffer, MAX_BUFSIZE),				boost::bind(&CConnect::HandleRead, shared_from_this(),				boost::asio::placeholders::error,				boost::asio::placeholders::bytes_transferred));		}	}private:	//	boost::asio::ip::tcp::socket m_Socket;	//	boost::array
m_chBuffer; std::string m_strHit;};

在这个例子里,表示服务器与一个客户端的沟通渠道,就是一个连接,封装为类CConnect。它是当服务器接收到一个客户端连接请求之后创建的,主要用来就是管理这个连接的生命周期,以及数据的接收和发送。从生命周期上来说,当一个连接创建时就旦生了,那什么时候死亡呢?在这个类的设计上是非常优秀,非常巧妙的,因为它不会为多生存一点时间而存在,也不会提前死掉而导致非法的内存访问。有这样的特性,主要是得益于它继承类enable_shared_from_this< CConnect >,这个类enable_shared_from_this的魔力,就是为了在类内部函数使用shared_ptr,可以维护类的实例不至于失去控制,导致提前死亡。也许你会说,在类里内部直接使用shared_ptr< CConnect >(this)进行强制转换,不就是一个智能指针了吗?可是在shared_ptr这样的智能指针是不能进行强制转换,因为强制转换并不能增加类对象的生命长度。也许你会说,还有别的方法,在类里增加一个shared_ptr< CConnect >成员变量,这样可以保存起来了,就达到生命周期的延长了。但这个方案虽然可以对象生命周期变长了,但也导致对象永远删除不了,这时,你也应想起前面学习过的shared_ptr智能指针时的一大缺陷,就是不能循环地引用。因此,需要使用weak_ptr智能指针做为成员变量,这样就没有这个问题了,这就是enable_shared_from_this所实现的方案,这就是为什么要继承enable_shared_from_this的原因。这样就可以解决智能指针在类内部引用的情况,但也有一个限制的,就是不能在这个类的构造函数里使用shared_from_this(),因为在构造函数里还没有真正创建shared_ptr,这时就去使用,显然是过早了。

有了这个魔法类之后,就可让对象的生命周期从一个局部作用域里转换到另外一个地方,比如在服务器接收到连接时调用HandleAccept函数,紧跟着调用CConnect的Start函数,在这个函数就调用了shared_from_this()函数,这样就让CConnect对象在局部作用域快要结束之时,再给它增加了生命,因此CConnect对象就可以在每次收到数据或发送数据时,都可以决定是否还要继续生存下去,都是通过调用shared_from_this()函数来实现的。这样当连接出错时,不再去调用shared_from_this()函数,导致这个对象生存期到了,就自动删除,达到释放资原的目标。

从这个例子里,不但学习到网络服务器怎么样接收客户端的连接,也学习到在类成员函数里维持一个共享智能指针的生存下去的方法,这样不仅让管理内存更简单,并且让资源的利用率达到极点,完全是按需分配,不早也不迟,何乐而不为。

转载地址:http://coixi.baihongyu.com/

你可能感兴趣的文章
多目标跟踪的简单理解
查看>>
Near-Online Multi-target Tracking with Aggregated Local Flow Descriptor
查看>>
Joint Tracking and Segmentation of Multiple Targets
查看>>
Subgraph Decomposition for Multi-Target Tracking
查看>>
JOTS: Joint Online Tracking and Segmentation
查看>>
CDT: Cooperative Detection and Tracking for Tracing Multiple Objects in Video Sequences
查看>>
Improving Multi-frame Data Association with Sparse Representations for Robust Near-online Multi-ob
查看>>
Virtual Worlds as Proxy for Multi-Object Tracking Analysis
查看>>
Multi-view People Tracking via Hierarchical Trajectory Composition
查看>>
Online Multi-Object Tracking via Structural Constraint Event Aggregation
查看>>
The Solution Path Algotithm for Identity-Aware Multi-Object Tracking
查看>>
Groupwise Tracking of Crowded Similar-Appearance Targets from Low-Continuity Image Sequences
查看>>
CDTS: Collaborative Detection, Tracking, and Segmentation for Online Multiple Object Segmentation
查看>>
Deep Network Flow for Multi-Object Tracking
查看>>
Multiple People Tracking by Lifted Multicut and Person Re-identification
查看>>
Multi-Object Tracking with Quadruplet Convolutional Neural Networks
查看>>
关于多目标跟踪的一点理解
查看>>
Learning by tracking:Siamese CNN for robust target association
查看>>
MUSTer:Multi-Store Tracker:A Cognitive Psychology Inspired Approach to Object Tracking
查看>>
Understanding and Diagnosing Visual Tracking Systems
查看>>