#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