当前存在的问题
在目前版本的网络通信引擎中,服务端收到数据(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