#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; ///< Accept ¿öÄ¿ ¾²·¹µå °³¼ö 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 @history - 2006.3.6 : pimpl idiomÀ¸·Î ¸É¹ö ĸ½¶È­ (taiyo) */ //================================================================================================== // 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