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

128 lines
3.9 KiB
C++

#pragma once
#ifndef NETWORK_MODULE_IOHANDLER_H
#define NETWORK_MODULE_IOHANDLER_H
//==================================================================================================
#include <process.h>
#define MAX_IO_WORKER_THREAD 16
#define EXTRA_ACCEPTEX_NUM 10
class Session;
class SessionPool;
class Acceptor;
class Connector;
class SessionList;
class IOCPServer;
class NetworkObject;
struct tagIOHANDLER_DESC;
typedef tagIOHANDLER_DESC IOHANDLER_DESC, *LPIOHANDLER_DESC;
typedef NetworkObject* (*fnCallBackCreateAcceptedObject)();
typedef void (*fnCallBackDestroyAcceptedObject)(NetworkObject* network_object);
typedef void (*fnCallBackDestroyConnectedObject)(NetworkObject* network_object);
//typedef void (*fnCallBackLog)(NetworkObject network_object, char* log_string);
//==================================================================================================
/// 리슨 소켓을 열고 접속을 처리하는 클래스
// - I/O 핸들러는 하나의 포트를 가지고 리슨할 수 있으며 별도의 세션 풀을 가지고 있다.
// - 접속이 이루어지면 세션풀에서 하나의 세션을 할당받아 소켓을 초기화한 후 TempSessionList에 추가한다.
//==================================================================================================
//
class IoHandler
{
public:
IoHandler();
~IoHandler();
void Init(IOCPServer* iocp_server, LPIOHANDLER_DESC description);
BOOL StartListen(char* ip_string, WORD port);
void Update();
void Shutdown();
DWORD Connect(NetworkObject* network_object, char* ip_string, WORD port);
BOOL IsListening();
void SuspendListenThread();
void ResumeListenThread();
DWORD GetNumberOfConnections() const;
DWORD GetKey() const;
Session* GetSession(DWORD session_index);
SessionList* GetActiveSessionList();
private:
Session* AllocAcceptSession();
Session* AllocConnectSession();
void FreeSession(Session* session);
void ReuseSession(Session* session);
void ProcessConnectSuccessList();
void ProcessConnectFailList();
void ProcessAcceptedSessionList();
void ProcessActiveSessionList();
void KickDeadSessions();
void ProcessSend();
void KickAllSessions();
union {
char field_start_pos_[1];
bool shutdown_;
};
IOCPServer* iocp_server_;
SessionPool* accept_session_pool_;
SessionPool* connect_session_pool_;
Acceptor* acceptor_;
Connector* connector_;
SessionList* active_session_list_;
SessionList* accepted_session_list_;
SessionList* connect_success_list_;
SessionList* connect_fail_list_;
SessionList* temp_session_list_;
SessionList* temp_session_pending_list_;
DWORD io_handler_key_;
HANDLE iocp_handle_; // IOCP 핸들
DWORD max_packet_size_;
DWORD number_of_accept_sessions_;
DWORD number_of_connect_sessions_;
DWORD max_number_of_accept_sessions_;
DWORD max_number_of_connect_sessions_;
DWORD number_of_io_threads_; // IO 워커 쓰레드 개수
HANDLE io_threads_[MAX_IO_WORKER_THREAD]; // IO 쓰레드 핸들
DWORD number_of_working_list_nodes_for_sender_;
Session** working_list_for_sender_;
Session** working_slots_for_sender_[2];
// 콜백 함수 포인터
fnCallBackCreateAcceptedObject fnCreateAcceptedObject_;
fnCallBackDestroyAcceptedObject fnDestroyAcceptedObject_;
fnCallBackDestroyConnectedObject fnDestroyConnectedObject_;
//
char field_end_pos_[1];
friend unsigned __stdcall io_thread(LPVOID param);
friend unsigned __stdcall send_thread(LPVOID param);
friend unsigned __stdcall accept_thread(LPVOID param);
friend unsigned __stdcall connect_thread(LPVOID param);
};
inline DWORD IoHandler::GetNumberOfConnections() const {
return number_of_accept_sessions_ + number_of_connect_sessions_;
}
inline DWORD IoHandler::GetKey() const {
return io_handler_key_;
}
inline SessionList* IoHandler::GetActiveSessionList() {
return active_session_list_;
}
#endif //NETWORK_MODULE_IOHANDLER_H