JNetLibray
|
클라이언트 TCP 세션의 생명 주기를 'JNetSession'을 통해 관리하며, 하위 클래스 객체의 세션 접근(송신, 수신 처리 및 연결 종료)에 대한 thread-safe 성을 보장함
등록된 세션의 소켓 장치를 IOCP 객체에 등록되면, 비동기 I/O 완료 처리를 IOCP 작업자 스레드를 통해 수행
클라이언트로부터의 패킷 수신 완료 및 연결 종료를 이벤트 함수(OnRecvCompletion, OnSessionLeave)를 통해 콜백하며, 패킷 송신 및 연결 종료 기능 함수(SendPacket, Disconnect)를 제공함
더 자세히 ...
#include <JNetCore.h>
클래스 | |
struct | JNetSession |
JNetCore에서 관리되는 세션 구조체 세션의 연결 소켓 및 수신 링-버퍼와 송신 락-프리 큐 버퍼를 멤버로 갖으며, 세션 ID와 참조 카운트 필드를 바탕으로 thread-safe한 세션 초기화 및 해제 기능을 제공 더 자세히 ... | |
Public 멤버 함수 | |
JNetCore (uint16 maximumOfSessions, uint32 numOfIocpConcurrentThrd, uint16 numOfIocpWorkerThrd, size_t tlsMemPoolUnitCnt, size_t tlsMemPoolUnitCapacity, uint32 memPoolBuffAllocSize, uint32 sessionRecvBuffSize, bool calcTpsThread) | |
~JNetCore () | |
bool | Start () |
void | Stop () |
uint16 | GetCurrentSessions () |
int64 | GetCurrentAllocatedMemUnitCnt () |
int | GetSessionCount () |
UINT | GetAcceptTPS () |
UINT | GetRecvTPS () |
UINT | GetSendTPS () |
UINT64 | GetTotalAcceptTransaction () |
UINT64 | GetTotalRecvTransaction () |
UINT64 | GetTotalSendTransaction () |
void | IncrementRecvTransactions (bool threadSafe, UINT incre) |
void | IncrementSendTransactions (bool threadSafe, UINT incre) |
void | IncrementAcceptTransactions (bool threadSafe=false, UINT incre=1) |
Protected 멤버 함수 | |
void | PrintLibraryInfoOnConsole () |
JNetSession * | CreateNewSession (SOCKET sock) |
하위 클래스에서 세션 객체 생성 요청을 위해 호출하는 함수 | |
bool | RegistSessionToIOCP (JNetSession *session) |
하위 클래스에서 세션 객체를 IOCP 등록을 위해 호출하는 함수 | |
bool | DeleteSession (SessionID64 sessionID) |
세션 제거 요청 함수 | |
void | Disconnect (SessionID64 sessionID) |
bool | SendPacket (SessionID64 sessionID, JBuffer *sendPktPtr, bool postToWorker=false) |
패킷 송신 요청 함수 | |
bool | SendPacketBlocking (SessionID64 sessionID, JBuffer *sendPktPtr) |
동기식 송신 요청 함수 | |
bool | BufferSendPacket (SessionID64 sessionID, JBuffer *sendPktPtr) |
세션 송신 버퍼 큐에 버퍼링(삽입만 진행) | |
bool | SendBufferedPacket (SessionID64 sessionID, bool postToWorker=false) |
세션 송신 버퍼 큐 내 송신 패킷 직렬화 버퍼에 대한 일괄 송신 작업 수행 | |
DWORD | AllocTlsMemPool () |
직렬화 패킷 버퍼 Tls 풀 할당 함수 | |
JBuffer * | AllocSerialBuff () |
직렬화 패킷 버퍼 할당 요청 wrapper | |
void | FreeSerialBuff (JBuffer *buff) |
직렬화 패킷 버퍼 반환 wrapper | |
void | AddRefSerialBuff (JBuffer *buff) |
직렬화 패킷 버퍼 참조 카운트 증가 wrapper | |
virtual bool | OnWorkerThreadCreate (HANDLE thHnd) |
Start() 함수 내 IOCP 작업자 스레드 생성(CREATE_SUSPENDED) 후 호출되는 이벤트 함수 | |
virtual void | OnAllWorkerThreadCreate () |
Start() 함수 내 요청된 수 만큼 IOCP 작업자 스레드를 생성한 후 함수를 빠져나오기 전 호출되는 이벤트 함수 | |
virtual void | OnWorkerThreadStart () |
개별 IOCP 작업자 스레드의 수행 흐름 초입부(WorkerThreadFunc 함수 초입부)에 호출되는 이벤트 함수, 개별 작업자 스레드의 초기화를 독립적으로 수행하도록 재정의 가능 | |
virtual void | OnWorkerThreadEnd () |
개별 IOCP 작업자 스레드가 종료(작업자 함수 return) 전 호출되는 이벤트 함수 | |
virtual void | OnRecvCompletion (SessionID64 sessionID, JBuffer &recvRingBuffer)=0 |
IOCP 작업자 스레드의 수신 완료 시 대상 세션의 수신 버퍼의 enqueue 오프셋 제어 후 호출되는 이벤트 함수 | |
virtual void | OnSessionLeave (SessionID64 sessionID) |
JNetCore 단 세션이 제거된 후 호출되는 이벤트 함수 | |
virtual void | OnError () |
Protected 속성 | |
bool | m_CalcTpsFlag |
Private 타입 | |
enum | enTransaction { ACCEPT_TRANSACTION , RECV_TRANSACTION , SEND_TRANSACTION , SEND_REQ_TRANSACTION } |
Private 멤버 함수 | |
JNetSession * | AcquireSession (SessionID64 sessionID) |
Multi IOCP 작업자 스레드 간 thread-safe 하지 않은 세션에 대해 세션 접근 전 호출하는 함수 | |
void | ReturnSession (JNetSession *session) |
AcquireSession을 통해 획득한 세션 객체 소유권 반납 | |
void | SendPost (SessionID64 sessionID, bool onSendFlag=false) |
SendPacket 계열 함수 내부에서 호출되는 실질적 송신 요청 함수 | |
void | SendPostRequest (SessionID64 sessionID) |
SendPost() 함수의 작업을 IOCP 작업자 스레드의 흐름에서 수행되도록 강제화를 요청하는 함수 | |
void | FreeBufferedSendPacket (LockFreeQueue< JBuffer * > &sendBufferQueue, queue< JBuffer * > &sendPostedQueue) |
세션 제거 시 송신 버퍼 정리 | |
void | Proc_DeleteSession (JNetSession *session) |
IOCP 작업자 스레드의 세션 삭제 요청 처리 함수 | |
void | Proc_SendPostRequest (JNetSession *session) |
IOCP 작업자 스레드의 송신 요청 시 처리 함수(SendPacket 계열 함수의 postToWorker 요청) | |
void | Proc_RecvCompletion (JNetSession *session, DWORD transferred) |
IOCP 작업자 스레드의 수신 완료 통지 시 처리 함수 | |
void | Proc_SendCompletion (JNetSession *session) |
IOCP 작업자 스레드의 송신 완료 통지 시 처리 함수 | |
void | IncrementTransactions (BYTE type, bool threadSafe=false, UINT incre=1) |
LONG | GetTransactionsPerSecond (BYTE type) |
UINT64 | GetTotalTransactions (BYTE type) |
정적 Private 멤버 함수 | |
static UINT __stdcall | WorkerThreadFunc (void *arg) |
IOCP 작업자 스레드의 수행 함수 | |
static UINT __stdcall | CalcTpsThreadFunc (void *arg) |
Private 속성 | |
std::vector< JNetSession * > | m_Sessions |
세션 관리 벡터 | |
uint16 | m_MaximumOfSessions |
수용 가능한 최대 세션 수 | |
LockFreeQueue< uint16 > | m_SessionIndexQueue |
세션 인덱스 할당 큐 (SessionID's index part) | |
uint64 | m_SessionIncrement |
세션 증분 (SessionID's increment part) | |
HANDLE | m_IOCP |
JNetCore's IOCP 객체 | |
uint16 | m_NumOfIocpWorkerThrd |
IOCP 작업자 스레드 갯수 | |
std::vector< HANDLE > | m_IocpWorkerThrdHnds |
IOCP 작업자 스레드 핸들 벡터 | |
std::vector< uint32 > | m_IocpWorkerThrdIDs |
IOCP 작업자 스레드's ID 벡터 | |
TlsMemPoolManager< JBuffer, true, false > | m_TlsMemPoolMgr |
Tls 메모리 풀 관리 (직렬화 패킷 버퍼 풀 할당 및 관리자) | |
size_t | m_TlsMemPoolUnitCnt |
size_t | m_TlsMemPoolUnitCapacity |
uint32 | m_MemPoolBuffAllocSize |
HANDLE | m_CalcTpsThread |
UINT | m_Transactions [NUM_OF_TPS_ITEM] |
UINT | m_TransactionsPerSecond [NUM_OF_TPS_ITEM] |
UINT64 | m_TotalTransaction [NUM_OF_TPS_ITEM] |
정적 Private 속성 | |
static const int | NUM_OF_TPS_ITEM = 4 |
클라이언트 TCP 세션의 생명 주기를 'JNetSession'을 통해 관리하며, 하위 클래스 객체의 세션 접근(송신, 수신 처리 및 연결 종료)에 대한 thread-safe 성을 보장함
등록된 세션의 소켓 장치를 IOCP 객체에 등록되면, 비동기 I/O 완료 처리를 IOCP 작업자 스레드를 통해 수행
클라이언트로부터의 패킷 수신 완료 및 연결 종료를 이벤트 함수(OnRecvCompletion, OnSessionLeave)를 통해 콜백하며, 패킷 송신 및 연결 종료 기능 함수(SendPacket, Disconnect)를 제공함
|
private |
열거형 멤버 | |
---|---|
ACCEPT_TRANSACTION | |
RECV_TRANSACTION | |
SEND_TRANSACTION | |
SEND_REQ_TRANSACTION |
JNetCore::JNetCore | ( | uint16 | maximumOfSessions, |
uint32 | numOfIocpConcurrentThrd, | ||
uint16 | numOfIocpWorkerThrd, | ||
size_t | tlsMemPoolUnitCnt, | ||
size_t | tlsMemPoolUnitCapacity, | ||
uint32 | memPoolBuffAllocSize, | ||
uint32 | sessionRecvBuffSize, | ||
bool | calcTpsThread ) |
maximumOfSessions | 수용 가능 최대 세션 수 설정 |
numOfIocpConcurrentThrd | IOCP 'concurrent threads' 설정 |
numOfIocpWorkerThrd | IOCP 작업자 스레드 수 설정 |
tlsMemPoolUnitCnt | Tls 메모리 풀 객체 초기 할당량 결정(직렬화 패킷 버퍼 수) |
tlsMemPoolUnitCapacity | Tls 메모리 풀 객체 수용량 결정(직렬화 패킷 버퍼 최대 용량) |
memPoolBuffAllocSize | |
sessionRecvBuffSize | |
calcTpsThread |
bool JNetCore::Start | ( | ) |
void JNetCore::Stop | ( | ) |
|
inline |
|
protected |
|
protected |
하위 클래스에서 세션 객체 생성 요청을 위해 호출하는 함수
sock | 세션과 대응되는 유효한 소켓 핸들 |
|
protected |
하위 클래스에서 세션 객체를 IOCP 등록을 위해 호출하는 함수
session | 등록하고자 하는 세션 객체 포인터 |
|
protected |
세션 제거 요청 함수
sessionID | 제거하고자하는 세션 아이디 |
|
protected |
|
protected |
패킷 송신 요청 함수
sessionID | 송신 대상 세션 아이디 |
송신 | 직렬화 패킷 버퍼 @postToWorker IOCP 작업자 스레드에 실질적 송신 작업(SendPost) 책임 전가(WSASend 호출 및 커널 모드 전환 처리 전가) |
|
protected |
동기식 송신 요청 함수
sessionID | 송신 대상 세션 아이디 |
송신 | 직렬화 패킷 버퍼 |
|
protected |
세션 송신 버퍼 큐에 버퍼링(삽입만 진행)
sessionID | 송신 대상 세션 아이디 |
송신 | 직렬화 패킷 버퍼 |
|
protected |
세션 송신 버퍼 큐 내 송신 패킷 직렬화 버퍼에 대한 일괄 송신 작업 수행
sessionID | 송신 대상 세션 아이디 @postToWorker IOCP 작업자 스레드에 실질적 송신 작업(SendPost) 책임 전가 |
|
inlineprotected |
직렬화 패킷 버퍼 Tls 풀 할당 함수
|
inlineprotected |
직렬화 패킷 버퍼 할당 요청 wrapper
|
inlineprotected |
직렬화 패킷 버퍼 반환 wrapper
|
inlineprotected |
직렬화 패킷 버퍼 참조 카운트 증가 wrapper
|
inline |
|
inline |
|
protectedvirtual |
Start() 함수 내 IOCP 작업자 스레드 생성(CREATE_SUSPENDED) 후 호출되는 이벤트 함수
thHnd | 생성된 IOCP 작업자 스레드 핸들 |
재정의를 통해 생성과 동시에 중지 상태인 IOCP 작업자 스레드의 핸들 인수를 통해 필요한 초기화 작업을 수행할 수 있다.
JNetCore에 설정된 IOCP 작업자 스레드 생성 갯수와 별개로 수행되는 작업자 스레드 갯수를 제어할 수 있다.
true 반환 시 중지된 작업자 스레드의 수행이 시작되고, false 반환 시 스레드는 강제 종료된다.
|
protectedvirtual |
Start() 함수 내 요청된 수 만큼 IOCP 작업자 스레드를 생성한 후 함수를 빠져나오기 전 호출되는 이벤트 함수
|
protectedvirtual |
개별 IOCP 작업자 스레드의 수행 흐름 초입부(WorkerThreadFunc 함수 초입부)에 호출되는 이벤트 함수, 개별 작업자 스레드의 초기화를 독립적으로 수행하도록 재정의 가능
IOCP 작업자 스레드 개별 수행 흐름의 초입에 호출되는 함수로 GetQueuedCompletionStatus 함수가 포함된 작업 루프 이전에 호출된다. 주로 JNetCore 단에서 관리되는 TLS 기반의 메모리 풀을 할당받고, 초기화하는 작업을 수행한다.
|
protectedvirtual |
개별 IOCP 작업자 스레드가 종료(작업자 함수 return) 전 호출되는 이벤트 함수
|
protectedpure virtual |
IOCP 작업자 스레드의 수신 완료 시 대상 세션의 수신 버퍼의 enqueue 오프셋 제어 후 호출되는 이벤트 함수
IOCP 작업자 스레드의 수신 완료 시 대상 세션의 수신 버퍼의 enqueue 오프셋 제어 후 호출되는 함수이다. JNetCore는 순전히 IOCP 작업자 스레드와 세션 관리 및 송수신의 책임만을 제공하기에 수신 이후의 작업을 하위 클래스에서 정의하도록 순수 가상 함수로써 강제하였다. OnRecvCompletion 함수의 반환 이후 해당 세션의 수신 버퍼가 수신 요청되기에 OnRecvCompletion 함수에서는 수신 버퍼에 대한 작업자 스레드 간의 경쟁은 없다. 따라서 단지 수신 버퍼의 참조만을 전달하여 복사 비용 발생을 방지하였다.
sessionID | 세션 아이디(uint64) |
recvRingBuffer | 세션의 수신 버퍼 참조 |
jnet::JNetClient, jnet::JNetServer에서 구현되었습니다.
|
protectedvirtual |
JNetCore 단 세션이 제거된 후 호출되는 이벤트 함수
sessionID | 세션 아이디(uint64) |
관리되는 세션이 제거된 후 호출되는 함수이다. 호출 시점에서 sessionID는 이미 제거된 세션 ID이며, 유효하지 않다. 콘텐츠 서버와 같은 하위 클래스에서 sessionID를 기반으로 한 데이터를 해당 함수 재정의에서 제거하는 등 정리 작업을 수행할 수 있다.
jnet::JNetClient, jnet::JNetServer에서 재구현되었습니다.
|
protectedvirtual |
|
private |
Multi IOCP 작업자 스레드 간 thread-safe 하지 않은 세션에 대해 세션 접근 전 호출하는 함수
접근 | 대상 세션 아이디 |
특정 세션에 대한 접근에 있어 thread-safe를 보장할 수 없다. 따라서 주로 컨텐츠 코드에서 호출되는 SendPacket 계열의 요청 함수에서는 세션 독점 점유가 필요하다.
AcquireSession 함수는 독점적인 점유를 보장한다. 독점적인 점유에 성공한다면 해당 세션 객체의 포인터를 반환하며, 실패 시 nullptr을 반환한다.
하위 클래스에 이벤트 함수 등으로 전달되는 세션 아이디(uin64)는 64비트열을 하나의 정수로 전달하는 간단한 추상화이며, JNetCore 단에서는 16비트의 인덱스 번호와 48비트의 증분 값으로 관리된다.
세션 객체의 참조 카운트와 단일 플래그로 구성된 참조 구조체 멤버를 원자적 연산으로 제어하여 세션 객체에 대한 동기화를 내부적으로 수행한다.
|
private |
AcquireSession을 통해 획득한 세션 객체 소유권 반납
세션 | 객체 포인터 |
|
private |
SendPacket 계열 함수 내부에서 호출되는 실질적 송신 요청 함수
sessionID | 송신 대상 세션 아이디 |
onSendFlag |
|
private |
SendPost() 함수의 작업을 IOCP 작업자 스레드의 흐름에서 수행되도록 강제화를 요청하는 함수
sessionID | 송신 대상 세션 아이디 |
|
private |
세션 제거 시 송신 버퍼 정리
|
staticprivate |
IOCP 작업자 스레드의 수행 함수
|
private |
IOCP 작업자 스레드의 세션 삭제 요청 처리 함수
|
private |
IOCP 작업자 스레드의 송신 요청 시 처리 함수(SendPacket 계열 함수의 postToWorker 요청)
|
private |
IOCP 작업자 스레드의 수신 완료 통지 시 처리 함수
|
private |
IOCP 작업자 스레드의 송신 완료 통지 시 처리 함수
|
staticprivate |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inlineprivate |
|
inlineprivate |
|
inlineprivate |
|
private |
세션 관리 벡터
|
private |
수용 가능한 최대 세션 수
|
private |
세션 인덱스 할당 큐 (SessionID's index part)
|
private |
세션 증분 (SessionID's increment part)
|
private |
JNetCore's IOCP 객체
|
private |
IOCP 작업자 스레드 갯수
|
private |
IOCP 작업자 스레드 핸들 벡터
|
private |
IOCP 작업자 스레드's ID 벡터
|
private |
Tls 메모리 풀 관리 (직렬화 패킷 버퍼 풀 할당 및 관리자)
|
private |
|
private |
|
private |
|
protected |
|
staticprivate |
|
private |
|
private |
|
private |
|
private |