Files
Sun1602/Server/include/IOCPServer.h
T
2022-10-26 12:25:11 +08:00

108 lines
4.1 KiB
C++

#pragma once
#ifndef NETWORK_MODULE_IOCP_SERVER_H
#define NETWORK_MODULE_IOCP_SERVER_H
//==================================================================================================
class NetworkObject;
class IoHandler;
typedef NetworkObject* (*fnCallBackCreateAcceptedObject)();
typedef void (*fnCallBackDestroyAcceptedObject)(NetworkObject* network_object);
typedef void (*fnCallBackDestroyConnectedObject)(NetworkObject* network_object);
//==================================================================================================
/// 包含初始化I/O处理器所需信息的结构体
//
typedef struct tagIOHANDLER_DESC
{
DWORD dwIoHandlerKey; ///< I/O处理器键
DWORD dwMaxAcceptSession; ///< 要连接的最大会话数
DWORD dwMaxConnectSession; ///< 连接到其他服务器的最大会话数
DWORD dwSendBufferSize; ///< 发送缓冲区大小
DWORD dwRecvBufferSize; ///< 接收缓冲区大小
DWORD dwTimeOut; ///< 连接会话的暂停
DWORD dwMaxPacketSize; ///< 一个包的最大大小
DWORD dwNumberOfIoThreads; ///< I/O工作线程数量
DWORD dwNumberOfAcceptThreads; ///< Accep工作线程数量
DWORD dwNumberOfConnectThreads; ///< Connect工作线程数量
fnCallBackCreateAcceptedObject fnCreateAcceptedObject; ///< 连接时NetworkObject回调
fnCallBackDestroyAcceptedObject fnDestroyAcceptedObject; ///< 解除连接时NetworkObject回调
fnCallBackDestroyConnectedObject fnDestroyConnectedObject; ///< 对连接到其他服务器的NetworkObject回调
} IOHANDLER_DESC, *LPIOHANDLER_DESC;
//==================================================================================================
/// IOCP服务器类
/**
@remarks
- IOCP服务器可以拥有多个I/O处理器.
(初始化2个以上的I/O处理器时,将LPIOHANDLER DESC重置为排列)
- I/O处理器有一个报告.
- 调用Update时检查所有会话的接收缓冲区,处理完成的数据包.
@see
IoHandler
tagIOHANDLER_DESC
*/
//==================================================================================================
//
class IOCPServer
{
public:
IOCPServer();
virtual ~IOCPServer();
BOOL Init(LPIOHANDLER_DESC description, DWORD number_of_io_handlers);
BOOL StartListen(DWORD io_handler_key, char* ip_string, WORD port);
void Update();
void Shutdown();
DWORD Connect(DWORD io_handler_key, NetworkObject* network_object, char* ip_string, WORD port);
BOOL IsListening(DWORD io_handler_key);
void SuspendListenThread(DWORD io_handler_key);
void ResumeListenThread(DWORD io_handler_key);
DWORD GetNumberOfConnections(DWORD io_handler_key);
DWORD GetMaxSendBuffer(DWORD io_handler_key, DWORD session_index);
DWORD GetCurSendBuffer(DWORD io_handler_key, DWORD session_index);
DWORD GetMaxRecvBuffer(DWORD io_handler_key, DWORD session_index);
DWORD GetCurRecvBuffer(DWORD io_handler_key, DWORD session_index);
void Display(DWORD io_handler_key, DWORD over_boundary_length);
private:
BOOL InitWinsock();
void CreateIoHandler(LPIOHANDLER_DESC description);
IoHandler* GetIoHandler(DWORD io_handler_key);
DWORD GetMaxBuffer(DWORD io_handler_key, DWORD session_index,
BOOL is_send_buffer, BOOL is_select_max_buffer);
struct InPimpl;
InPimpl* in_impl_;
friend unsigned __stdcall send_thread(LPVOID param);
};
//--------------------------------------------------------------------------------------------------
inline DWORD IOCPServer::GetMaxSendBuffer(DWORD io_handler_key, DWORD session_index)
{
return GetMaxBuffer(io_handler_key, session_index, true, true);
}
inline DWORD IOCPServer::GetCurSendBuffer(DWORD io_handler_key, DWORD session_index)
{
return GetMaxBuffer(io_handler_key, session_index, true, false);
}
inline DWORD IOCPServer::GetMaxRecvBuffer(DWORD io_handler_key, DWORD session_index)
{
return GetMaxBuffer(io_handler_key, session_index, false, true);
}
inline DWORD IOCPServer::GetCurRecvBuffer(DWORD io_handler_key, DWORD session_index)
{
return GetMaxBuffer(io_handler_key, session_index, false, false);
}
//==================================================================================================
#endif //NETWORK_MODULE_IOCP_SERVER_H