GrabBag/VrNets/tcpServer/_Inc/CYServerTask.h

114 lines
2.1 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#pragma once
#include <vector>
#include <mutex>
#include <thread>
#include <atomic>
#include <condition_variable>
#ifndef _WIN32
#include <sys/types.h>
#include <sys/socket.h>
#endif // !_WIN32
#include "IYTCPServer.h"
typedef std::function<void (const TCPClient* pClient, const char* pData, const unsigned int nLen)> FunTCPServerRecv;
#define RECV_DATA_LEN 12 * 1024 * 1024
#ifdef _WIN32
#define FD_SETSIZE 1024
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <WinSock2.h>
#include <windows.h>
#pragma comment(lib, "ws2_32.lib")
#else
#define SOCKET int
#define INVALID_SOCKET (SOCKET)(~0)
#define SOCKET_ERROR (-1)
#endif
enum WORK_STATUS
{
WORK_INIT,
WORK_RUNING,
WORK_WAITSINGAL,
WORK_CLOSE,
WORK_EXIT,
};
class CYServerTask
{
public:
CYServerTask();
~CYServerTask();
/// 开始任务
bool StartTask(FunTCPServerRecv fRecv, bool bRecvSelfProtocol = false);
///设置异常处理回调给CYTCPServer使用
void SetExceptionCallback(std::function<void(const TCPClient*)> fException);
///ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD>
bool StopTask();
///添加客户端
bool AddClient(TCPClient* pClient);
///移除客户端
bool DelClient(const TCPClient* pClient);
///获取Task中客户端的数目
int GetClientNum();
private:
void _OnProcessEvent();
bool _OnProcessData(TCPClient* pClient);
private:
///客户端存储vector
std::mutex m_mClient;
std::vector<TCPClient *> m_vClient;
///select 监听 注释和m_vClient使用同一把锁
int m_maxSocket;
fd_set m_fdRead;
fd_set m_fdExp;
///线程管理
std::thread* m_tTask;
bool m_bWork;
WORK_STATUS m_eWorkStatus;
//工作信号
std::mutex m_mutexWork;
std::condition_variable m_cvWork;
//处理回调[接口]
private:
//处理回调[接口]
FunTCPServerRecv m_fRecv;
std::function<void(const TCPClient*)> m_fException;
char* m_pRecvBuf;
std::atomic<bool> m_bUseProtocol;
struct ProtocolHead
{
int nHead;
int nTime;
int nCmd;
int nDef;
int nLen;
int nTail;
char pData[RECV_DATA_LEN];
};
ProtocolHead* m_pProtocalHead;
};