115 lines
4.6 KiB
C
115 lines
4.6 KiB
C
|
#ifndef HGL_NETWORK_IOSOCKET_INCLUDE
|
|||
|
#define HGL_NETWORK_IOSOCKET_INCLUDE
|
|||
|
|
|||
|
#include<hgl/network/Socket.h>
|
|||
|
|
|||
|
namespace hgl
|
|||
|
{
|
|||
|
namespace network
|
|||
|
{
|
|||
|
/**
|
|||
|
* 输入输出用Socket
|
|||
|
*/
|
|||
|
class IOSocket:public Socket ///传输数据用Socket基类
|
|||
|
{
|
|||
|
protected:
|
|||
|
|
|||
|
int64 send_total; ///<发送字节数统计
|
|||
|
int64 recv_total; ///<接收字节数统计
|
|||
|
|
|||
|
double recv_time_out; ///<数据接收超时
|
|||
|
double last_recv_time; ///<最后一次接收数据的时间
|
|||
|
|
|||
|
public:
|
|||
|
|
|||
|
IOSocket()
|
|||
|
{
|
|||
|
Clear();
|
|||
|
}
|
|||
|
|
|||
|
virtual ~IOSocket()=default;
|
|||
|
|
|||
|
virtual void Clear()
|
|||
|
{
|
|||
|
send_total=0;
|
|||
|
recv_total=0;
|
|||
|
recv_time_out=HGL_NETWORK_DOUBLE_TIME_OUT;
|
|||
|
last_recv_time=0;
|
|||
|
}
|
|||
|
|
|||
|
virtual void CloseSocket()override ///<关闭连接
|
|||
|
{
|
|||
|
Socket::CloseSocket();
|
|||
|
Clear();
|
|||
|
}
|
|||
|
|
|||
|
virtual const double &GetRecvTimeOut()const{return recv_time_out;} ///<取得接收数据超时时间
|
|||
|
virtual void SetRecvTimeOut(const double to){recv_time_out=to;} ///<设置接收数据超时时间
|
|||
|
|
|||
|
public: //事件函数
|
|||
|
|
|||
|
/**
|
|||
|
* 接收数据处理事件函数
|
|||
|
* @param recv_buf_size 缓冲区内的数据长度(注:此参数并不是所有平台都可以获取,所以在值为-1时,需要不停的获取数据直到出错)
|
|||
|
* @param ct 当前时间
|
|||
|
* @return 成功获取的数据字节数
|
|||
|
*/
|
|||
|
virtual int OnRecv(int recv_buf_size=-1,const double ct=0)
|
|||
|
{
|
|||
|
last_recv_time=ct;
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 发送数据处理事件函数
|
|||
|
* @param send_buf_size 发送数据缓冲区内可用最大长度(注:此参数并不是所有平台都可以获取,所以在值为-1时,依然可以发送数据)
|
|||
|
* @param left_bytes 剩余未发送的字节数(如果为0,下一次将不参与轮循。此功能待测试是否需要,因为将SOCKET从列表中反复添加删除,也会影响效能)
|
|||
|
* @return 成功发送的数据字节数
|
|||
|
*/
|
|||
|
virtual int OnSend(int send_buf_size/*,int &left_bytes*/)
|
|||
|
{
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 错误处理事件函数
|
|||
|
* @param errno_number 错误号
|
|||
|
*/
|
|||
|
virtual void OnError(int errno_number)
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 关闭事件函数
|
|||
|
*/
|
|||
|
virtual void OnClose()
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 刷新事件函数,由开发者重写实现。这里故意写为纯虚函数,是为了提醒开发者此函数的存在,即便什么都不做,也必须由开发者自行实现。
|
|||
|
* @return 是否正常,如返回否则会让管理器认为此socket出错需要退出
|
|||
|
*/
|
|||
|
virtual bool OnUpdate()=0;
|
|||
|
|
|||
|
public: //属性函数
|
|||
|
|
|||
|
const int64 GetSendTotal()const{return send_total;} ///<取得发送字节数统计
|
|||
|
const int64 GetRecvTotal()const{return recv_total;} ///<取得接收字节数统计
|
|||
|
|
|||
|
const void RestartLastRecvTime(){last_recv_time=0;} ///<复位最后获取数据时间
|
|||
|
const double GetLastRecvTime()const{return last_recv_time;} ///<取得最后获取数据时间
|
|||
|
const bool CheckRecvTimeOut(const double ct) ///<检测是否超时
|
|||
|
{
|
|||
|
if((last_recv_time>0)
|
|||
|
&&(last_recv_time+recv_time_out<ct))
|
|||
|
return(true);
|
|||
|
|
|||
|
return(false);
|
|||
|
}
|
|||
|
};//class IOSocket
|
|||
|
}//namespace network
|
|||
|
}//namespace hgl
|
|||
|
#endif//HGL_NETWORK_IOSOCKET_INCLUDE
|
|||
|
|