C++Socket 多线程编程 服务端收发数据业务分离

本文探讨了C++ Socket服务端在处理网络通信时,由于在同一线程中进行recv和send可能导致的问题。为解决TCP缓冲区满导致的网络阻塞,提出了采用消费者-生产者模型,将收发数据业务分离到不同线程,以实现业务逻辑解耦。通过定义任务基类和执行任务的服务类,实现了线程间的数据交互。
摘要由CSDN通过智能技术生成

当前存在的问题

在目前版本的网络通信引擎中,服务端收到数据(recv)后,会立即对给它发网络数据的客户端返回一个网络数据包(send),并且recv和send的做法是在同一个线程中的。

那么存在什么问题呢? 我们都知道TCP是面向字节流的传输协议,TCP连接的双方都有一个数据缓冲区用来接收数据。那么如果一方发送的速度远大于另一方接收的速度时,可能会导致接收方的缓冲区满,从而导致网络阻塞。

在同一个线程中做recv和send会存在一个问题,如果send被阻塞了,那么recv也将无法进行。因此,容易想到的做法是将recv和send分开到不同的线程中,使业务逻辑解耦。

收发数据分离的消费者-生产者模型

生产者-消费者模型一般存在一个 临界缓冲区,生产者向缓冲区内写数据,消费者从缓冲区内读数据。

收发网络数据的业务很容易的理解为,收数据为生产者,发数据为消费者。生产者线程收到数据后,会向缓冲区输入它想要发送的数据,然后消费者线程取出数据后进行发送。

任务基类 和 执行任务的服务类

//网络消息发送任务
class CellSendMsg2ClientTask : public CellTask
{
private:
	ClientSocket* _pClient;	//发送到客户端目的地
	DataHeader* _pHeader;	//要发送的数据
public:
	CellSendMsg2ClientTask(ClientSocket* pClient, DataHeader *header)
	{
		_pClient = pClient;
		_pHeader = header;
	}
	//执行任务方法
	void doTask()
	{
		_pClient->Sen
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值