Files
2026-02-13 14:34:15 +08:00

68 lines
1.6 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.
#ifndef __IOCPSERVER_H__
#define __IOCPSERVER_H__
#include <map>
#include "IDAllocator.h"
#include "Overlapped.h"
#include "TCPSocket.h"
#include "IOThreads.h"
using namespace std;
void ErrorExit(LPTSTR lpszFunction);
class CTCPSocket;
typedef map<WORD,CTCPSocket*> SocketMap;
typedef CArray<CIOWorkerThread *> CIOWorkerThreadPtrArray;
class CIOCPServer
{
public:
CIOCPServer(void);
virtual ~CIOCPServer(void);
//启动
bool Start(WORD nMaxClient, WORD nPort);
//停止
void Stop();
// 有新的客户端连接时,产生的事件
virtual CTCPSocket* onCreateTCPSocket(WORD nClient, WORD socket, DWORD dwClientAddr);
// 断开客户端
bool Disconnect(WORD nClient);
// 发送数据
bool SendData(WORD nClient, void* data, DWORD len);
public:
// 插入socketmap并分配一个ID
CTCPSocket* CreateTCPSocket(SOCKET socket, DWORD dwClientAddr);
WORD InserTCPSocket(CTCPSocket* tcpSocket);
void RemoveTCPSocket(WORD nClient);
CTCPSocket* GetTCPSocket(WORD nClient);
bool PostRecv(WORD nClient, SOCKET socket);
public:
// 事件通知
virtual int OnAccept(WORD nClient) {return 0;}
virtual int OnClose(WORD nClient) {return 0;}
virtual int OnSend(WORD nClient, char* pData, DWORD dwDataLen) {return 0;}
virtual int OnReceive(WORD nClient, char* pData, DWORD dwDataLen) {return 0;}
virtual int OnError(WORD nClient, int iError) {return 0;}
private:
CIOAcceptThread m_IOAcceptThread; //应答线程
CIOWorkerThreadPtrArray m_IOWorkerThreadArray; //读写线程
SOCKET m_hServerSocket;
HANDLE m_hCompletionPort;
SocketMap m_mapSocket;
CCriticalSection m_cs;
IDAllocator m_idAllocator;
};
#endif