84 lines
3.2 KiB
C++
84 lines
3.2 KiB
C++
#ifndef HGL_NETWORK_TCP_ACCEPT_INCLUDE
|
||
#define HGL_NETWORK_TCP_ACCEPT_INCLUDE
|
||
|
||
#include<hgl/network/TCPSocket.h>
|
||
#include<hgl/type/DataArray.h>
|
||
namespace hgl
|
||
{
|
||
namespace network
|
||
{
|
||
/**
|
||
* TCPAccept与SocketManage
|
||
*
|
||
* TCPAccept: 客户端连接到服务器后的控制对象
|
||
* SocketManage: 服务器对批量TCPAccept进行管理的对象
|
||
* SocketManageThread: SocketManage的异步封装
|
||
*
|
||
* 收包流程:
|
||
* 1.SocketManage通过OnSocketRecv函数通知TCPAccept接收数据
|
||
* 2.TCPAccept在收满4个字节的包长后,根据包长向MultiLevelMemoryPool申请缓冲区
|
||
* 3.TCPAccept收满一个包后,通过OnRecvPacket事件函数通知开发者有包了
|
||
* 4.TCPAccept将缓冲区送回BufferPool
|
||
*/
|
||
|
||
using PACKET_SIZE_TYPE=uint32; ///<描述包长度的数据类型
|
||
constexpr uint PACKET_SIZE_TYPE_BYTES=sizeof(PACKET_SIZE_TYPE); ///<描述包长度的数据类型的字节长度
|
||
|
||
class SocketInputStream;
|
||
class SocketOutputStream;
|
||
|
||
/**
|
||
* TCP服务器接入用户处理基类,为各种Server管理器提供统一调用接口<br>
|
||
* *******************************************************************<br>
|
||
* 收包和发包是可以在不同线程异步同时工作的,现在写一起只是暂时,未来分开
|
||
*/
|
||
class TCPAccept:public TCPSocket
|
||
{
|
||
protected:
|
||
|
||
SocketInputStream *sis=nullptr;
|
||
SocketOutputStream *sos=nullptr;
|
||
|
||
protected://事件函数,由SocketManage调用
|
||
|
||
friend class SocketManage;
|
||
|
||
virtual int OnSocketRecv(int)=0; ///<Socket接收处理函数
|
||
virtual int OnSocketSend(int){return 0;} ///<Socket发送处理函数
|
||
virtual void OnSocketError(int)=0; ///<Socket错误处理函数
|
||
|
||
bool Send(void *,const uint); ///<发送原始数据
|
||
|
||
public:
|
||
|
||
using TCPSocket::TCPSocket;
|
||
virtual ~TCPAccept();
|
||
|
||
};//class TCPAccept:public TCPSocket
|
||
|
||
class TCPAcceptPacket:public TCPAccept
|
||
{
|
||
protected:
|
||
|
||
DataArray<uchar> recv_buffer;
|
||
uint recv_length=0;
|
||
|
||
uint64 recv_total=0;
|
||
|
||
protected:
|
||
|
||
virtual int OnSocketRecv(int) override; ///<Socket接收处理函数
|
||
|
||
public:
|
||
|
||
TCPAcceptPacket(); ///<本类构造函数
|
||
TCPAcceptPacket(int,IPAddress *); ///<本类构造函数
|
||
virtual ~TCPAcceptPacket()=default;
|
||
|
||
virtual bool SendPacket(void *,const PACKET_SIZE_TYPE &); ///<发包
|
||
virtual bool OnRecvPacket(void *,const PACKET_SIZE_TYPE &)=0; ///<接收包事件函数
|
||
};//class TCPAcceptPacket:public TCPAccept
|
||
}//namespace network
|
||
}//namespace hgl
|
||
#endif//HGL_NETWORK_TCP_ACCEPT_INCLUDE
|