JNetLibray
로딩중...
검색중...
일치하는것 없음
jnet::JNetServer 클래스 참조abstract

서버 기능이 구체화된 'JNetCore' 하위 클래스, 클라이언트와의 연결 완료 시 '세션 객체 생성' 및 'IOCP 객체에 소켓 장치 등록' 수행
패킷 수신 완료 시의 이벤트 함수에 디코딩 작업(OnRecv)과 패킷 송신 기능 함수에 인코딩 작업 추가
더 자세히 ...

#include <JNetCore.h>

jnet::JNetServer에 대한 상속 다이어그램 :
jnet::JNetCore jnet::JNetOdbcServer jnet::jgroup::JNetGroupServer

Public 멤버 함수

 JNetServer (const char *serverIP, uint16 serverPort, uint16 maximumOfConnections, PACKET_CODE packetCode_LAN, PACKET_CODE packetCode, PACKET_SYMM_KEY packetSymmetricKey, bool recvBufferingMode, uint16 maximumOfSessions, uint32 numOfIocpConcurrentThrd, uint16 numOfIocpWorkerThrd, size_t tlsMemPoolUnitCnt, size_t tlsMemPoolUnitCapacity, uint32 memPoolBuffAllocSize, uint32 sessionRecvBuffSize, bool calcTpsThread)
 
bool Start ()
 
void Stop ()
 
void PrintServerInfoOnConsole ()
 
- jnet::JNetCore(으)로부터 상속된 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 멤버 함수

virtual void OnPrintLogOnConsole ()
 
bool SendPacket (SessionID64 sessionID, JBuffer *sendPktPtr, bool postToWorker=false, bool encoded=false)
 JNetCore 요청 함수 + 송신 패킷 인코딩 기능
 
bool SendPacketBlocking (SessionID64 sessionID, JBuffer *sendPktPtr, bool encoded=false)
 
bool BufferSendPacket (SessionID64 sessionID, JBuffer *sendPktPtr, bool encoded=false)
 
JBuffer * AllocSerialSendBuff (uint16 len, bool LAN=false)
 직렬화 패킷 버퍼 할당 + 헤더 초기화
 
virtual bool OnConnectionRequest (const SOCKADDR_IN &clientSockAddr)
 Accept 반환 시 호출되는 이벤트 함수, 클라이언트 수용 여부를 반환을 통해 결정
 
virtual void OnClientJoin (SessionID64 sessionID, const SOCKADDR_IN &clientSockAddr)=0
 클라이언트 연결 수용 후 정상적으로 세션을 생성한 이 후 호출되는 이벤트 함수
 
virtual void OnClientLeave (SessionID64 sessionID)=0
 클라이언트와의 연결 종료 및 클라이언트 세션 제거 후 호출되는 이벤트 함수
 
virtual void OnRecv (SessionID64 sessionID, JBuffer &recvBuff)
 패킷 수신 시 호출되는 이벤트 함수
 
virtual void OnRecv (SessionID64 sessionID, JSerialBuffer &recvSerialBuff)
 패킷 수신 시 호출되는 이벤트 함수, 수신 버퍼링 모드의 서버 전용
 
- jnet::JNetCore(으)로부터 상속된 Protected 멤버 함수
void PrintLibraryInfoOnConsole ()
 
JNetSessionCreateNewSession (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 OnError ()
 

Protected 속성

BYTE m_PacketCode_LAN
 LAN 구간 패킷 코드
 
BYTE m_PacketCode
 LAN 외부 통신 패킷 코드
 
BYTE m_PacketSymmetricKey
 대칭-키
 
- jnet::JNetCore(으)로부터 상속된 Protected 속성
bool m_CalcTpsFlag
 

Private 멤버 함수

void PrintLibraryInfoOnConsole ()
 
virtual void OnRecvCompletion (SessionID64 sessionID, JBuffer &recvRingBuffer) override
 IOCP 작업자 스레드의 수신 완료 시 대상 세션의 수신 버퍼의 enqueue 오프셋 제어 후 호출되는 이벤트 함수
 
virtual void OnSessionLeave (SessionID64 sessionID) override
 JNetCore 단 세션이 제거된 후 호출되는 이벤트 함수
 

정적 Private 멤버 함수

static UINT __stdcall AcceptThreadFunc (void *arg)
 Accept 스레드의 수행 함수
 

Private 속성

SOCKADDR_IN m_ListenSockAddr
 서버 바인딩 주소
 
SOCKET m_ListenSock
 서버 리슨 소켓
 
uint16 m_MaximumOfConnections
 수용 가능한 최대 연결 수
 
uint16 m_NumOfConnections
 현재 연결된 연결 수
 
HANDLE m_AcceptThreadHnd
 Accept 스레드 핸들
 
bool m_RecvBufferingMode
 수신 버퍼링 모드 플래그
 

상세한 설명

서버 기능이 구체화된 'JNetCore' 하위 클래스, 클라이언트와의 연결 완료 시 '세션 객체 생성' 및 'IOCP 객체에 소켓 장치 등록' 수행
패킷 수신 완료 시의 이벤트 함수에 디코딩 작업(OnRecv)과 패킷 송신 기능 함수에 인코딩 작업 추가

생성자 & 소멸자 문서화

◆ JNetServer()

jnet::JNetServer::JNetServer ( const char * serverIP,
uint16 serverPort,
uint16 maximumOfConnections,
PACKET_CODE packetCode_LAN,
PACKET_CODE packetCode,
PACKET_SYMM_KEY packetSymmetricKey,
bool recvBufferingMode,
uint16 maximumOfSessions,
uint32 numOfIocpConcurrentThrd,
uint16 numOfIocpWorkerThrd,
size_t tlsMemPoolUnitCnt,
size_t tlsMemPoolUnitCapacity,
uint32 memPoolBuffAllocSize,
uint32 sessionRecvBuffSize,
bool calcTpsThread )
매개변수
serverIP서버 IP 주소
serverPort서버 포트
maximumOfConnections최대 커넥션 수용 갯수
packetCode_LANLAN 구간 내 송수신 패킷 코드(JNetLibrary system's common packet code)
packetCode클라이언트와의 송수신 패킷 코드
packetSymmetricKey대칭키(고정)
recvBufferingMode단일 세션에 대한 수신 완료 통지 시 수신 가능한 모든 패킷을 한 번에 읽은 후 'JSerialBuffer'에 담고 이를 인수로 수신 이벤트 함수 호출
maximumOfSessions최대 세션 수용 개수
numOfIocpConcurrentThrdIOCP 'Number of Concurrent Threads' 설정 값
numOfIocpWorkerThrdIOCP 객체를 통해 관리될 작업자 스레드 갯수 설정 값
tlsMemPoolUnitCntTLS 메모리 풀의 할당 단위 기준 초기 설정 값
tlsMemPoolUnitCapacityTLS 메모리 풀 할당 단위 기준 최대 개수
memPoolBuffAllocSizeTLS 메모리 풀 할당 단위 크기
sessionRecvBuffSize세션 수신 버퍼 크기(링-버퍼)
calcTpsThread서버 TPS(Transaction per seconds) 측정 플래그, 플래그 ON 시 'CalcTpsThreadFunc' 작업 함수 수행 스레드 생성
14 : m_MaximumOfConnections(maximumOfConnections), m_NumOfConnections(0),
15 m_PacketCode_LAN(packetCode_LAN), m_PacketCode(packetCode), m_PacketSymmetricKey(packetSymmetricKey), m_RecvBufferingMode(recvBufferingMode),
17 maximumOfSessions, numOfIocpConcurrentThrd, numOfIocpWorkerThrd,
18 tlsMemPoolUnitCnt, tlsMemPoolUnitCapacity,
19 memPoolBuffAllocSize, sessionRecvBuffSize,
20 calcTpsThread
21 )
22{
24 if (serverIP == nullptr) {
26 }
27 else {
28 m_ListenSockAddr = CreateServerADDR(serverIP, serverPort);
29 }
30 int optval = 1;
31 setsockopt(m_ListenSock, SOL_SOCKET, SO_REUSEADDR, (char*)&optval, sizeof(optval));
32
33 cout << "JNetServer::JNetServer(..), Listen Socket Init Done.." << endl;
34}
SOCKET CreateWindowSocket_IPv4(bool isTCP, OUT int *errCode=NULL)
SOCKADDR_IN CreateServerADDR(const char *serverIp, uint16 port)
Definition WinSocketAPI.cpp:136
SOCKADDR_IN CreateServerADDR_ANY(uint16 port)
Definition WinSocketAPI.cpp:158
JNetCore(uint16 maximumOfSessions, uint32 numOfIocpConcurrentThrd, uint16 numOfIocpWorkerThrd, size_t tlsMemPoolUnitCnt, size_t tlsMemPoolUnitCapacity, uint32 memPoolBuffAllocSize, uint32 sessionRecvBuffSize, bool calcTpsThread)
Definition JNetCore.cpp:5
SOCKADDR_IN m_ListenSockAddr
서버 바인딩 주소
Definition JNetCore.h:365
SOCKET m_ListenSock
서버 리슨 소켓
Definition JNetCore.h:366
uint16 m_NumOfConnections
현재 연결된 연결 수
Definition JNetCore.h:369
uint16 m_MaximumOfConnections
수용 가능한 최대 연결 수
Definition JNetCore.h:368
BYTE m_PacketCode
LAN 외부 통신 패킷 코드
Definition JNetCore.h:377
bool m_RecvBufferingMode
수신 버퍼링 모드 플래그
Definition JNetCore.h:373
BYTE m_PacketCode_LAN
LAN 구간 패킷 코드
Definition JNetCore.h:376
BYTE m_PacketSymmetricKey
대칭-키
Definition JNetCore.h:378

멤버 함수 문서화

◆ Start()

bool jnet::JNetServer::Start ( )
37{
38 if (!JNetCore::Start()) {
39 return false;
40 }
41
42 // 리슨 소켓 바인딩
43 if (BindSocket(m_ListenSock, m_ListenSockAddr) == SOCKET_ERROR) {
44 return false;
45 }
46 cout << "JNetServer::Start(), Binding Listen Socket Done.." << endl;
47
48 // 리슨 소켓 Accept 준비
49 // 24.06.21
50 // 로그인-채팅 더미 시 Connect Fail 다수 발생
51 // SOMAXCONN으로만 설정 시 백로그 큐는 200, SOMAXCONN_HINT을 통해 백로그 큐 확대
52 if (ListenSocket(m_ListenSock, SOMAXCONN_HINT(65535)) == SOCKET_ERROR) {
53 return false;
54 }
55 cout << "JNetServer::Start(), Listen Socket Ready To Accept.." << endl;
56
57 // 링거 옵션 추가 (강제 종료 유도)
58 // => 서버가 TCP 능동 폐쇄자가 될 시 TIME_WAIT 상태 패널티를 회피하기 위함
59 // onoff: ON / linger: 0, FIN 세그먼트가 아닌 RST 세그먼트를 보냄으로써 4-Way 세그먼트 교환과 TIME_WAIT 패널티 없이 클라이언트와의 연결을 강제 종료
60 struct linger linger_option;
61 linger_option.l_onoff = 1;
62 linger_option.l_linger = 0;
63 setsockopt(m_ListenSock, SOL_SOCKET, SO_LINGER, (const char*)&linger_option, sizeof(linger_option));
64
65 // Accept 스레드 생성
66 m_AcceptThreadHnd = (HANDLE)_beginthreadex(NULL, 0, JNetServer::AcceptThreadFunc, this, 0, NULL);
67 cout << "[Start Thread] Accept Thread" << endl;
68
69 cout << "JNetServer::Start(), Create Accept Thread Done.." << endl;
70
71 return true;
72}
bool BindSocket(SOCKET &sock, SOCKADDR_IN &serverAddr, OUT int *errCode=NULL)
bool ListenSocket(SOCKET &sock, int backlog, OUT int *errCode=NULL)
bool Start()
Definition JNetCore.cpp:63
static UINT __stdcall AcceptThreadFunc(void *arg)
Accept 스레드의 수행 함수
Definition JNetServer.cpp:243
HANDLE m_AcceptThreadHnd
Accept 스레드 핸들
Definition JNetCore.h:371

◆ Stop()

void jnet::JNetServer::Stop ( )
75{
77 TerminateThread(m_AcceptThreadHnd, 0);
78}
void Stop()
Definition JNetCore.cpp:96

◆ PrintServerInfoOnConsole()

void jnet::JNetServer::PrintServerInfoOnConsole ( )
inline
411 {
412 system("cls"); // 콘솔 창 지우기
413 static size_t logCnt = 0;
414 static COORD coord;
415 coord.X = 0;
416 coord.Y = 0;
417 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
418
420 cout << "==========================================================" << endl;
422 }
void PrintLibraryInfoOnConsole()
Definition JNetServer.cpp:80
virtual void OnPrintLogOnConsole()
Definition JNetCore.h:424

◆ OnPrintLogOnConsole()

virtual void jnet::JNetServer::OnPrintLogOnConsole ( )
inlineprotectedvirtual
424{}

◆ PrintLibraryInfoOnConsole()

void jnet::JNetServer::PrintLibraryInfoOnConsole ( )
private
80 {
82 cout << "======================= JNetServer =======================" << endl;
83 cout << "JNetServer::Maximum of Connections : " << m_MaximumOfConnections << endl;
84 cout << "JNetServer::Current Valid Connections Count: " << m_NumOfConnections << endl;
85}
void PrintLibraryInfoOnConsole()
Definition JNetCore.cpp:112

◆ SendPacket()

bool jnet::JNetServer::SendPacket ( SessionID64 sessionID,
JBuffer * sendPktPtr,
bool postToWorker = false,
bool encoded = false )
protected

JNetCore 요청 함수 + 송신 패킷 인코딩 기능

매개변수
encodedencoded: false의 경우 함수 내 인코딩 수행
88{
89 if (!encoded) {
90 UINT offset = 0;
91 stMSG_HDR* hdr;
92 while (offset < sendPktPtr->GetUseSize()) {
93 hdr = (stMSG_HDR*)sendPktPtr->GetBufferPtr(offset);
94 offset += sizeof(stMSG_HDR);
95 if (hdr->randKey == (BYTE)-1) {
96 hdr->randKey = GetRandomKey();
97 Encode(m_PacketSymmetricKey, hdr->randKey, hdr->len, hdr->checkSum, sendPktPtr->GetBufferPtr(offset));
98 }
99 offset += hdr->len;
100 }
101 }
102
103 return JNetCore::SendPacket(sessionID, sendPktPtr, postToWorker);
104}
unsigned char BYTE
Definition CommTypes.h:3
bool SendPacket(SessionID64 sessionID, JBuffer *sendPktPtr, bool postToWorker=false)
패킷 송신 요청 함수
Definition JNetCore.cpp:155
void Encode(BYTE symmetricKey, BYTE randKey, USHORT payloadLen, BYTE &checkSum, BYTE *payloads)
Definition JNetEncryption.cpp:3
BYTE GetRandomKey()
Definition JNetCore.h:349
Definition JNetCore.h:339
BYTE randKey
Definition JNetCore.h:342
uint16 len
Definition JNetCore.h:341
BYTE checkSum
Definition JNetCore.h:343

◆ SendPacketBlocking()

bool jnet::JNetServer::SendPacketBlocking ( SessionID64 sessionID,
JBuffer * sendPktPtr,
bool encoded = false )
protected
매개변수
encodedencoded: false의 경우 함수 내 인코딩 수행
107{
108 if (!encoded) {
109 UINT offset = 0;
110 stMSG_HDR* hdr;
111 while (offset < sendPktPtr->GetUseSize()) {
112 hdr = (stMSG_HDR*)sendPktPtr->GetBufferPtr(offset);
113 offset += sizeof(stMSG_HDR);
114 if (hdr->randKey == (BYTE)-1) {
115 hdr->randKey = GetRandomKey();
116 Encode(m_PacketSymmetricKey, hdr->randKey, hdr->len, hdr->checkSum, sendPktPtr->GetBufferPtr(offset));
117 }
118 offset += hdr->len;
119 }
120 }
121
122 return JNetCore::SendPacketBlocking(sessionID, sendPktPtr);
123}
bool SendPacketBlocking(SessionID64 sessionID, JBuffer *sendPktPtr)
동기식 송신 요청 함수
Definition JNetCore.cpp:177

◆ BufferSendPacket()

bool jnet::JNetServer::BufferSendPacket ( SessionID64 sessionID,
JBuffer * sendPktPtr,
bool encoded = false )
protected
매개변수
encodedencoded: false의 경우 함수 내 인코딩 수행
126{
127 if (!encoded) {
128 UINT offset = 0;
129 stMSG_HDR* hdr;
130 while (offset < sendPktPtr->GetUseSize()) {
131 hdr = (stMSG_HDR*)sendPktPtr->GetBufferPtr(offset);
132 offset += sizeof(stMSG_HDR);
133 if (hdr->randKey == (BYTE)-1) {
134 hdr->randKey = GetRandomKey();
135 Encode(m_PacketSymmetricKey, hdr->randKey, hdr->len, hdr->checkSum, sendPktPtr->GetBufferPtr(offset));
136 }
137 offset += hdr->len;
138 }
139 }
140
141 return JNetCore::BufferSendPacket(sessionID, sendPktPtr);
142}
bool BufferSendPacket(SessionID64 sessionID, JBuffer *sendPktPtr)
세션 송신 버퍼 큐에 버퍼링(삽입만 진행)
Definition JNetCore.cpp:202

◆ AllocSerialSendBuff()

JBuffer * jnet::JNetServer::AllocSerialSendBuff ( uint16 len,
bool LAN = false )
inlineprotected

직렬화 패킷 버퍼 할당 + 헤더 초기화

매개변수
len페이로드(데이터) 길이
LANLAN: true, LAN 구간 패킷 코드 설정 / LAN: false, LAN 외 구간(클라이언트) 패킷 코드 설정
440 {
441 JBuffer* msg = AllocSerialBuff();
442 stMSG_HDR* hdr = msg->DirectReserve<stMSG_HDR>();
443 if (!LAN) {
444 hdr->code = m_PacketCode;
445 }
446 else {
447 hdr->code = m_PacketCode_LAN;
448 }
449 hdr->len = len;
450 hdr->randKey = -1;
451
452 return msg;
453 }
JBuffer * AllocSerialBuff()
직렬화 패킷 버퍼 할당 요청 wrapper
Definition JNetCore.h:137

◆ OnConnectionRequest()

virtual bool jnet::JNetServer::OnConnectionRequest ( const SOCKADDR_IN & clientSockAddr)
inlineprotectedvirtual

Accept 반환 시 호출되는 이벤트 함수, 클라이언트 수용 여부를 반환을 통해 결정

매개변수
clientSockAddr연결 요청 클라이언트의 주소 정보
반환값
false 리턴: '설정된 커넥션 한계 값 도달' 의미
459 {
461 return false;
462 }
463 else {
464 return true;
465 }
466 }

◆ OnClientJoin()

virtual void jnet::JNetServer::OnClientJoin ( SessionID64 sessionID,
const SOCKADDR_IN & clientSockAddr )
protectedpure virtual

클라이언트 연결 수용 후 정상적으로 세션을 생성한 이 후 호출되는 이벤트 함수

매개변수
sessionID연결된 클라이언트 세션 ID
clientSockAddr연결된 클라이언트 주소 정보

◆ OnClientLeave()

virtual void jnet::JNetServer::OnClientLeave ( SessionID64 sessionID)
protectedpure virtual

클라이언트와의 연결 종료 및 클라이언트 세션 제거 후 호출되는 이벤트 함수

매개변수
sessionID종료 클라이언트 세션 ID

이벤트 함수 호출 이후 동일 세션 ID로 다른 이벤트 발생이 없음을 보장

◆ OnRecv() [1/2]

virtual void jnet::JNetServer::OnRecv ( SessionID64 sessionID,
JBuffer & recvBuff )
inlineprotectedvirtual

패킷 수신 시 호출되는 이벤트 함수

매개변수
recvBuffjnet 정의 헤더 + 페이로드 단위의 낱개 수신 직렬화 버퍼

jnet::jgroup::JNetGroupServer에서 재구현되었습니다.

480{}

◆ OnRecv() [2/2]

virtual void jnet::JNetServer::OnRecv ( SessionID64 sessionID,
JSerialBuffer & recvSerialBuff )
inlineprotectedvirtual

패킷 수신 시 호출되는 이벤트 함수, 수신 버퍼링 모드의 서버 전용

매개변수
recvSerialBuff복수의 수신 직렬화 버퍼를 추상화한 'JSerialBuffer'

jnet::jgroup::JNetGroupServer에서 재구현되었습니다.

484{}

◆ OnRecvCompletion()

void jnet::JNetServer::OnRecvCompletion ( SessionID64 sessionID,
JBuffer & recvRingBuffer )
overrideprivatevirtual

IOCP 작업자 스레드의 수신 완료 시 대상 세션의 수신 버퍼의 enqueue 오프셋 제어 후 호출되는 이벤트 함수

IOCP 작업자 스레드의 수신 완료 시 대상 세션의 수신 버퍼의 enqueue 오프셋 제어 후 호출되는 함수이다. JNetCore는 순전히 IOCP 작업자 스레드와 세션 관리 및 송수신의 책임만을 제공하기에 수신 이후의 작업을 하위 클래스에서 정의하도록 순수 가상 함수로써 강제하였다. OnRecvCompletion 함수의 반환 이후 해당 세션의 수신 버퍼가 수신 요청되기에 OnRecvCompletion 함수에서는 수신 버퍼에 대한 작업자 스레드 간의 경쟁은 없다. 따라서 단지 수신 버퍼의 참조만을 전달하여 복사 비용 발생을 방지하였다.

매개변수
sessionID세션 아이디(uint64)
recvRingBuffer세션의 수신 버퍼 참조

jnet::JNetCore를 구현.

145{
147 JSerialBuffer jserialBuff;
148 uint32 totalRecvCnt = 0;
149 while (recvRingBuffer.GetUseSize() >= sizeof(PACKET_CODE) + sizeof(PACKET_LEN)) {
150 PACKET_CODE code;
151 recvRingBuffer.Peek(&code);
152 PACKET_LEN len;
153 recvRingBuffer.Peek(sizeof(code), &len);
154 if (code == m_PacketCode_LAN) {
155 if (recvRingBuffer.GetUseSize() < sizeof(code) + sizeof(len) + len) {
156 break;
157 }
158 else {
159 recvRingBuffer.DirectMoveDequeueOffset(sizeof(code) + sizeof(len));
160 jserialBuff.Serialize(recvRingBuffer, len, true);
161 recvRingBuffer.DirectMoveDequeueOffset(len);
162 totalRecvCnt++;
163 }
164 }
165 else if (code == m_PacketCode) {
166 if (recvRingBuffer.GetUseSize() < sizeof(stMSG_HDR) + len) {
167 break;
168 }
169 else {
170 stMSG_HDR hdr;
171 recvRingBuffer >> hdr;
172 if (!Decode(m_PacketSymmetricKey, hdr.randKey, hdr.len, hdr.checkSum, recvRingBuffer)) {
173 DebugBreak();
174 return;
175 }
176 else {
177 jserialBuff.Serialize(recvRingBuffer, len, true);
178 recvRingBuffer.DirectMoveDequeueOffset(len);
179 totalRecvCnt++;
180 }
181 }
182 }
183 else {
184 DebugBreak();
185 return;
186 }
187 }
188 if(m_CalcTpsFlag) IncrementRecvTransactions(true, totalRecvCnt);
189 OnRecv(sessionID, jserialBuff);
190 }
191 else {
192 while (recvRingBuffer.GetUseSize() >= sizeof(PACKET_CODE) + sizeof(PACKET_LEN)) {
193 PACKET_CODE code;
194 PACKET_LEN len;
195 recvRingBuffer.Peek(&code);
196 recvRingBuffer.Peek(sizeof(code), &len);
197
198 if (code == m_PacketCode_LAN) {
199 if (recvRingBuffer.GetUseSize() < sizeof(code) + sizeof(len) + len) {
200 break;
201 }
202 else {
204
205 recvRingBuffer.DirectMoveDequeueOffset(sizeof(code) + sizeof(len));
206 JBuffer recvPacket = recvRingBuffer.SliceBuffer(len, true);
207 OnRecv(sessionID, recvPacket);
208 recvRingBuffer.DirectMoveDequeueOffset(len);
209 }
210 }
211 else if (code == m_PacketCode) {
212 if (recvRingBuffer.GetUseSize() < sizeof(stMSG_HDR) + len) {
213 break;
214 }
215 else {
216 stMSG_HDR hdr;
217 recvRingBuffer >> hdr;
218 if (!Decode(m_PacketSymmetricKey, hdr.randKey, hdr.len, hdr.checkSum, recvRingBuffer)) {
219 DebugBreak();
220 return;
221 }
222 else {
224
225 JBuffer recvPacket = recvRingBuffer.SliceBuffer(len, true);
226 OnRecv(sessionID, recvPacket);
227 recvRingBuffer.DirectMoveDequeueOffset(len);
228 }
229 }
230 }
231 else {
232 DebugBreak();
233 return;
234 }
235 }
236 }
237
238 if (recvRingBuffer.GetUseSize() == 0) {
239 recvRingBuffer.ClearBuffer();
240 }
241}
unsigned __int32 uint32
Definition CommTypes.h:10
bool m_CalcTpsFlag
Definition JNetCore.h:230
void IncrementRecvTransactions(bool threadSafe, UINT incre)
Definition JNetCore.h:255
virtual void OnRecv(SessionID64 sessionID, JBuffer &recvBuff)
패킷 수신 시 호출되는 이벤트 함수
Definition JNetCore.h:480
uint16 PACKET_LEN
Definition JNetCore.h:336
bool Decode(BYTE symmetricKey, BYTE randKey, USHORT payloadLen, BYTE checkSum, BYTE *payloads)
Definition JNetEncryption.cpp:25
BYTE PACKET_CODE
Definition JNetCore.h:334

◆ OnSessionLeave()

virtual void jnet::JNetServer::OnSessionLeave ( SessionID64 sessionID)
inlineoverrideprivatevirtual

JNetCore 단 세션이 제거된 후 호출되는 이벤트 함수

매개변수
sessionID세션 아이디(uint64)

관리되는 세션이 제거된 후 호출되는 함수이다. 호출 시점에서 sessionID는 이미 제거된 세션 ID이며, 유효하지 않다. 콘텐츠 서버와 같은 하위 클래스에서 sessionID를 기반으로 한 데이터를 해당 함수 재정의에서 제거하는 등 정리 작업을 수행할 수 있다.

jnet::JNetCore(으)로부터 재구현되었습니다.

488 {
489 InterlockedDecrement16(reinterpret_cast<short*>(&m_NumOfConnections));
490 OnClientLeave(sessionID);
491 }
virtual void OnClientLeave(SessionID64 sessionID)=0
클라이언트와의 연결 종료 및 클라이언트 세션 제거 후 호출되는 이벤트 함수

◆ AcceptThreadFunc()

UINT __stdcall JNetServer::AcceptThreadFunc ( void * arg)
staticprivate

Accept 스레드의 수행 함수

243 {
244 JNetServer* server = reinterpret_cast<JNetServer*>(arg);
245 server->AllocTlsMemPool();
246
247 while (true) {
248 SOCKADDR_IN clientAddr;
249 int addrLen = sizeof(clientAddr);
250 SOCKET clientSock = ::accept(server->m_ListenSock, (sockaddr*)&clientAddr, &addrLen);
251 if (clientSock != INVALID_SOCKET) {
252 if (server->m_CalcTpsFlag) server->IncrementAcceptTransactions();
253
254 if (!server->OnConnectionRequest(clientAddr)) {
255 //shutdown(clientSock, SD_BOTH); // TCP '절반 폐쇄' 관련
256 closesocket(clientSock);
257 }
258 else {
259 // 세션 생성
260 InterlockedIncrement16(reinterpret_cast<short*>(&server->m_NumOfConnections));
261 JNetSession* newSession = server->CreateNewSession(clientSock);
262 if (newSession != nullptr) {
263 // 세션 생성 이벤트
264 server->OnClientJoin(newSession->m_ID, clientAddr);
265 if (!server->RegistSessionToIOCP(newSession)) {
266#if defined(ASSERT)
267 DebugBreak();
268#endif
269 server->DeleteSession(newSession->m_ID);
270 server->OnSessionLeave(newSession->m_ID);
271 }
272 }
273 else {
274#if defined(server_ASSERT)
275 DebugBreak();
276#else
277 shutdown(clientSock, SD_BOTH);
278 closesocket(clientSock);
279#endif
280 }
281 }
282 }
283 else {
284 int32 errCode = ::WSAGetLastError();
285 cout << "[err] Accept Thread Exit..." << errCode << endl;
286 break;
287 }
288 }
289 return 0;
290}
__int32 int32
Definition CommTypes.h:6
bool DeleteSession(SessionID64 sessionID)
세션 제거 요청 함수
Definition JNetCore.cpp:488
void IncrementAcceptTransactions(bool threadSafe=false, UINT incre=1)
Definition JNetCore.h:257
JNetSession * CreateNewSession(SOCKET sock)
하위 클래스에서 세션 객체 생성 요청을 위해 호출하는 함수
Definition JNetCore.cpp:443
DWORD AllocTlsMemPool()
직렬화 패킷 버퍼 Tls 풀 할당 함수
Definition JNetCore.h:132
bool RegistSessionToIOCP(JNetSession *session)
하위 클래스에서 세션 객체를 IOCP 등록을 위해 호출하는 함수
Definition JNetCore.cpp:456
서버 기능이 구체화된 'JNetCore' 하위 클래스, 클라이언트와의 연결 완료 시 '세션 객체 생성' 및 'IOCP 객체에 소켓 장치 등록' 수행 패킷 수신 완료 시의 이벤트 ...
Definition JNetCore.h:363
virtual void OnSessionLeave(SessionID64 sessionID) override
JNetCore 단 세션이 제거된 후 호출되는 이벤트 함수
Definition JNetCore.h:488
virtual bool OnConnectionRequest(const SOCKADDR_IN &clientSockAddr)
Accept 반환 시 호출되는 이벤트 함수, 클라이언트 수용 여부를 반환을 통해 결정
Definition JNetCore.h:458
virtual void OnClientJoin(SessionID64 sessionID, const SOCKADDR_IN &clientSockAddr)=0
클라이언트 연결 수용 후 정상적으로 세션을 생성한 이 후 호출되는 이벤트 함수

멤버 데이터 문서화

◆ m_ListenSockAddr

SOCKADDR_IN jnet::JNetServer::m_ListenSockAddr
private

서버 바인딩 주소

◆ m_ListenSock

SOCKET jnet::JNetServer::m_ListenSock
private

서버 리슨 소켓

◆ m_MaximumOfConnections

uint16 jnet::JNetServer::m_MaximumOfConnections
private

수용 가능한 최대 연결 수

◆ m_NumOfConnections

uint16 jnet::JNetServer::m_NumOfConnections
private

현재 연결된 연결 수

◆ m_AcceptThreadHnd

HANDLE jnet::JNetServer::m_AcceptThreadHnd
private

Accept 스레드 핸들

◆ m_RecvBufferingMode

bool jnet::JNetServer::m_RecvBufferingMode
private

수신 버퍼링 모드 플래그

◆ m_PacketCode_LAN

BYTE jnet::JNetServer::m_PacketCode_LAN
protected

LAN 구간 패킷 코드

◆ m_PacketCode

BYTE jnet::JNetServer::m_PacketCode
protected

LAN 외부 통신 패킷 코드

◆ m_PacketSymmetricKey

BYTE jnet::JNetServer::m_PacketSymmetricKey
protected

대칭-키


이 클래스에 대한 문서화 페이지는 다음의 파일들로부터 생성되었습니다.: