108 lines
4.1 KiB
C++
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
|