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
|
|||
|
|
|