106 lines
2.3 KiB
C++
106 lines
2.3 KiB
C++
#ifndef _WORK_SOCKET_H_
|
||
#define _WORK_SOCKET_H_
|
||
|
||
#include "os_def.h"
|
||
#define flushProtoPacket(x) FlushProtoPacket(x, __FILE__, __LINE__)
|
||
using namespace tick64;
|
||
using namespace container;
|
||
using namespace lock;
|
||
using namespace net;
|
||
|
||
class WorkSocket :
|
||
public BaseSocket,
|
||
public SendPacketPool
|
||
{
|
||
public:
|
||
const static size_t MAX_DATA_LEN = 32 * 1024 * 1024; // 每个网络数据包加上包头的最大长度
|
||
public:
|
||
WorkSocket(const char* name);
|
||
virtual ~WorkSocket();
|
||
virtual void SingleRun();
|
||
|
||
//数据包填充完毕后需要调用flushProtoPacket提交到发送队列
|
||
DataPacket& allocProtoPacket(uint16_t cmd);
|
||
DataPacket& AllocProtoPacket(int nIdent, int nSessionIdx, SOCKET nSocket, int nServerIdx);
|
||
|
||
void FlushProtoPacket(DataPacket& packet, const char* fn, int line);
|
||
|
||
//发送内部消息
|
||
void PostMsg(UINT uMsg, size_t para1, size_t para2, size_t para3, size_t para4);
|
||
|
||
//初始化网络库(调用WSAStartup),返回0表示成功
|
||
static int InitSocketLib();
|
||
//卸载网络库(调用WSACleanup)
|
||
static void UnintSocketLib();
|
||
|
||
// 是否有未处理的数据
|
||
bool HasRemainData();
|
||
// 是否自动发送数据包
|
||
void SetAutoSend(bool flag)
|
||
{
|
||
auto_send_ = flag;
|
||
}
|
||
|
||
// 发送数据
|
||
void SendBuffers();
|
||
|
||
// 线程在每一次loop是否空转
|
||
inline bool GetBusy()
|
||
{
|
||
return busy_;
|
||
}
|
||
protected:
|
||
virtual void OnRecv();
|
||
|
||
/**** 以下函数集为子类可能需要覆盖的函数 ****/
|
||
virtual bool PreProcess(DataPacketReader*)
|
||
{
|
||
return true;
|
||
}
|
||
|
||
virtual void OnRecvSysMsg(unsigned int msg, size_t p1, size_t p2, size_t p3, size_t p4);
|
||
virtual void OnRun();
|
||
virtual void OnRecv(const UInt16 cmd, char* buf, int size);
|
||
|
||
void ProcessRecvData(DataPacket* data_buf);
|
||
|
||
protected:
|
||
void ProcessSysMsg();
|
||
void ClearSendBuffers();
|
||
int ReadSocket();
|
||
inline int GetMsgCount()
|
||
{
|
||
return msg_list_.count();
|
||
}
|
||
void Disconnected();
|
||
void SendKeepAlive();
|
||
void SetRecvSize(int size)
|
||
{
|
||
recv_size_ = size;
|
||
}
|
||
inline void SleepX()
|
||
{
|
||
Sleep(1);
|
||
}
|
||
inline void SetBusy(bool busy)
|
||
{
|
||
busy_ = busy_ || busy;
|
||
}
|
||
|
||
protected:
|
||
time_t last_msg_t_; //上次通信的时间
|
||
QueueList<APPINTERNALMSG> msg_list_; //内部消息列表
|
||
bool busy_;
|
||
private:
|
||
DataPacket* proc_pack_;
|
||
BaseAllocator allocator_;
|
||
|
||
Mutex msg_lock_; //内部消息列表锁
|
||
size_t recv_size_;
|
||
bool auto_send_;
|
||
};
|
||
|
||
|
||
#endif
|
||
|