λͺ©λ‘μ 체 κΈ (1099)
KoreanFoodie's Study
[C++ κ²μ μλ²] 4-10. PacketSession ν΅μ¬ : 1. κ°λ¨νκ² ν¨ν·μ λ§λ€μ΄ 보μ. μ¬μ€ λ°μ΄ν°μ size μ id(νλ‘ν μ½) μ ν€λλ‘ λΆμ΄λ©΄, κ·Έκ² κΈ°λ³Έμ μΈ ν¨ν·μ ννλ€. 2. Session μ μ κ±°νκ³ λ£μ λλ κΈ°μ‘΄ 컨ν μ΄λμ μ ν©μ±μ΄ κΉ¨μ§μ§ μλλ‘ μ£Όμνμ. μ΄λ₯Ό ννΌνκΈ° μν΄ ν΄λΌκ° μ’ λ£λ λ, λ°λ‘ μΈμ μ μ κ±°νμ§ μκ³ , λμ Disconnect μ΄λ²€νΈλ₯Ό λ±λ‘λ§ ν λ€μ λ€λ₯Έ μ°λ λκ° Dispatch λ λ μΈμ μ μ κ±°νκ² λ§λ€ μλ μλ€. μ λ²κΉμ§λ λ²νΌμ μ°λ¦¬κ° 보λ΄λ €κ³ νλ λ¬Έμμ΄μ κ·Έλ₯ λ΄μμ 보λλ€. κ·Έλ°λ° μ€μ κ²μμμλ μ΄ λ°μ΄ν°κ° λ¬΄μ¨ λ°μ΄ν°μΈμ§μ λν μ λ³΄κ° νμνλ°, νν μ°λ¦¬λ μ΄κ²μ ν¨ν·μ΄λΌκ³ νλ€. μ¦, ν΄λΉ μ 보μ λν λ©ν μ 보(νν ν€λ λΆλΆμ..
[C++ κ²μ μλ²] 4-9. SendBuffer Pooling ν΅μ¬ : 1. SendBuffer λ₯Ό λ³΄λΌ λλ§λ€ λ©λͺ¨λ¦¬ ν λΉμ νμ§ λ§κ³ , Memory Pooling κΈ°λ²μ μ΄μ©ν΄μ ν° μ΄κΈ°μ 1 λ²λ§ ν λΉμ νλ κΈ°λ²μ μ¬μ©ν΄ 보μ. 2. μ€μ Session μμλ SendBufferManager λ₯Ό μ΄μ©ν΄ λ²νΌλ₯Ό μ¬μ©ν μ€λΉ(Open ν¨μ)λ₯Ό νλ€. SendBufferManager -> SendBufferChunk -> SendBuffer μμΌλ‘ κ³μΈ΅μ΄ μ‘ν μλ€. 3. SendBufferChunkRef νμ μ μΈμλ₯Ό κ° μ°λ λλ³λ‘ TLS(Thread-Local Space)μ μ‘μ λλ©΄, κ° μ°λ λ λΌλ¦¬ Chunk μ μ κ·Όνλ λ° μμ΄ κ²½ν©μ λ²μΌ νμκ° μμ΄ ν¨μ¨μ μ΄λ€. λν Lock-Free μ€..
[C++ κ²μ μλ²] 4-8. SendBuffer ν΅μ¬ : 1. Send λ Recv λ³΄λ€ μ΄μ§ 볡μ‘ν μ μλ€. Lock λ±μΌλ‘ λκΈ°ν μ΄μλ₯Ό μ ν΄κ²°ν΄ μ£Όμ΄μΌ νλ€. 2. Session μ κ°―μκ° λ§μμ§ κ²½μ°, SessionManager λ₯Ό μ΄μ©ν΄ Session μ κ΄λ¦¬ν΄ 보μ. μ΄λ² κΈμμλ SendBuffer λ₯Ό λ§λ€μ΄ 보μ. μ΄μ μ Send λ Recv λ³΄λ€ μ‘°κΈ λ 볡μ‘ν μλ μλ€κ³ μκΈ°ν λ° μλλ°... κ·Έλμ κ·Έλ°μ§ Send λ Recv λ³΄λ€ μμ£Ό μ΄μ§(?) 볡μ‘ν κ²μ΄λ€ π λ¨Όμ , μ΄μ μ Session μμ λ§λ€μλ Send μ ꡬνμ ν λ² λ³΄μ. void Session::Send(BYTE* buffer, int32 len) { // μκ°ν λ¬Έμ // 1) λ²νΌ κ΄λ¦¬? // 2) se..
[C++ κ²μ μλ²] 4-7. RecvBuffer ν΅μ¬ : 1. RecvBuffer λ₯Ό λ§λ€ λλ, ReadPos / WritePos μ κ΄λ ¨ν μ²λ¦¬λ₯Ό μ΄λ»κ² ν κ²μΈμ§κ° μ€μνλ€. 2. λ³΄ν΅ BufferSize λ³΄λ€ ν¬κ² λ©λͺ¨λ¦¬λ₯Ό ν λΉν΄, Clean μ ν¨μ¨μ μΌλ‘ ꡬννλ λ°©λ²μ λ§μ΄ μ¬μ©νλ€. μ΄μ μ Recv λ Send μ λΉν΄ λΉκ΅μ κ΅¬μ‘°κ° κ°λ¨νλ€κ³ λ§ν μ μ΄ μλ€. μλλ©΄... Send λ μ¬λ¬ κ΅°λ°μμ λμμ νΈμΆνκ³ λ리λ₯Ό μΉμ§λ§, Recv λ κ²°κ΅ λ©ν° μ°λ λ νκ²½μΌμ§λΌλ λμμ λ°λ κ²μ΄ μλλΌ μμ°¨μ μΌλ‘ λ°κ² λμ΄ μμΌλ―λ‘(λ Όλ¦¬μ), μλμ μΌλ‘ μμ (?) ν μ λ°μ μλ κ²μ΄λ€ π λ¬Όλ‘ , Recv μ κ²½μ°μλ RecvBuffer λ₯Ό μ΄λ»κ² λ§λ€μ΄μΌ μ’μμ§μ λν΄μλ κ³ λ―Όμ΄ μ½κ° νμ..
[C++ κ²μ μλ²] 4-6. Session #3 ν΅μ¬ : 1. μμΌμ μΈμ μ΄ λ«ν λλ§λ€ Close νμ§ μκ³ , μ¬μ¬μ©ν μ μμμ μμ λμ(DisconnectEx) 2. μΈμ ν΄λμ€λ₯Ό ν΅μ μ μΌκ°λ₯Ό λ§λ€μ΄ λλ©΄, μλ²-ν΄λΌμ΄μΈνΈ λ¨μμλ μμΌλ‘ μ¬μ€μ λ‘μ§κ³Ό κ΄λ ¨λ ꡬνλ§ μ§μ€ν΄λ λλ€! μ΄λ² κΈμμλ μΈμ μ ꡬνμ λ§λ¬΄λ¦¬ μ§μΌλ©΄μ, λμμ DummyClient μμλ μΈμ μ ν΅ν ꡬνμ μ μ©ν΄ 보λλ‘ νκ² λ€. μΌλ¨ μ΄μ μ Session μμ ꡬννλ Disconnect ν¨μλ₯Ό λ€μ 보면... void Session::Disconnect(const WCHAR* cause) { if (_connected.exchange(false) == false) return; // TEMP wcout
[C++ κ²μ μλ²] 4-5. Session #2 ν΅μ¬ : 1. Session ꡬνμ μμ΄, Send λ λλ¦ λ³΅μ‘ν ꡬμμ΄ μλ€. 2. μ‘μ λ²νΌλ₯Ό μ΄λ»κ² λ§λ€ κ²μΈμ§, μ μ‘ μ μ¬λ¬ μ°λ λκ° Pending μνλ‘ λμμ λ, μμκ° λ°λμ 보μ₯λμ΄μΌ νλμ§ λ±λ±μ μκ°νλ©΄μ ꡬνν΄ λ³΄μ. μ΄λ² κΈμμλ μ΄μ μ λ§λ€μλ Session κ΄λ ¨ ν΄λμ€μ λ΄μ©μ λ§λΆμ¬ λ³΄κ² λ€. μ‘°κΈ λ ꡬ체μ μΌλ‘ μ΄μΌκΈ°νμλ©΄, Send νλ λΆλΆμ κ°λ¨νκ² κ΅¬νν΄ λ³Ό κ²μ΄λ€. π κ·Έλμ κΈ°μ‘΄μ Session μ½λμμ λ°λ λΆλΆλ§ μ΄μ§ 보면... Session.h /*-------------- Session ---------------*/ class Session : public IocpObject { public: voidP..
[C++ κ²μ μλ²] 4-4. Session #1 ν΅μ¬ : 1. κ²μ μΈμ μ λν κΈ°λ³Έ λμκ³Ό ꡬνμ μμ§νμ. μ μΌ μ€μν κ²μ, νλ¦μ΄λ€. 2. μΈμ μ λν Reference Count λ μν©μ λ§κ² μ μ²λ¦¬ν΄ μ£Όμ΄μΌ, IocpObject λ Session μμ Memory Leak μ΄ λ°μνμ§ μλλ€. μ΄λ² κΈμμλ, Session ν΄λμ€λ₯Ό λ§λ€κ³ κΈ°λ³Έμ μΈ Accept λμμ ν μ μλλ‘ κ΅¬νμ μ§νν΄ λ³΄κ² λ€. λ¨Όμ Session ν΄λμ€μ ꡬνμ ν λ² λ³΄μ. Session.h #pragma once #include "IocpCore.h" #include "IocpEvent.h" #include "NetAddress.h" class Service; /*-------------- Session -..
[C++ κ²μ μλ²] 4-3. Server Service ν΅μ¬ : 1. IocpObject λ μμ μ±μ μν΄ shared_ptr λ₯Ό μ°¨μ©νλ κ²μ΄ μ’λ€. 2. μλ²λ ν΄λΌμ΄μΈνΈμλ§ ν΅μ νμ§ μκ³ , λ€λ₯Έ μλ²λ DB μλ²μλ ν΅μ ν μ μλ€. λ°λΌμ μ©λμ λ°λΌ μΈμ μ μμ± λ° κ΄λ¦¬λ₯Ό ν μ μλλ‘, μλΉμ€λ₯Ό λ§λ€μ΄ μ£Όλ©΄ νΈλ¦¬νλ€. μ°λ¦¬λ μ΄μ μ IOCP Core ν΄λμ€λ₯Ό λ§λ€μ΄ νΈλ€, μΈμ , μμΌκ³Ό κ΄λ ¨ν κΈ°λ₯λ€μ κ°λ¨ν λ€λ£° μ μλλ‘ λ§λ€μλ€. κ·Έλ°λ° μ΄μ μ μ°λ¦¬κ° λ§λ IOCP ν΄λμ€λ 리μ€λμμ Accept λ₯Ό λ°μΌλ©΄ μΈμ μ μμλ‘ μμ±νλ μμΌλ‘ ꡬνμ΄ λμ΄ μλ€. κ·Έλ°λ° μ¬μ€ μΈμ μ νΉμ μλ²μ μ’ μλλ©΄ μμ λκ° λ¨μ΄μ§κ² λλ€. μ°λ¦¬λ μΌλ°μ μΌλ‘ κ²μ μλ²λΌκ³ νλ©΄ 'ν΄λΌμ΄μΈνΈ μλ²' μ¬μ΄μ ..
μ½λ© ν μ€νΈλ₯Ό λλΉνμ¬, μμμΌ ν μκ³ λ¦¬μ¦ λͺ©λ‘μ μ 리νλ©° μ½μ΄λ³΄λ©΄ μ’μ λΈλ‘κ·Έ λ§ν¬λ€μ μ°κ²°ν΄ 보μλ€(μ κ° μμ±ν κ²μ μλ). μ½μ΄λ΄μ§ν κΈλ€μ λ§ν¬λ₯Ό λ¬μ κ²μ΄λ, μ½ν λ‘ μμ μμ΄νκΈ° μ μ λλλ₯Ό μμ΄νλλ° μ¬μ©νλ©΄ μ’κ² λ€! π€£ κΈ°λ³Έ μ λ ¬ - ν΅μνΈ - νμνΈ - λ¨Έμ§μνΈ μ°μ μμν(ν) μ΄λΆνμ DFS(κΉμ΄ μ°μ νμ) BFS(λλΉ μ°μ νμ) λ°±νΈλνΉ κ·Έλ¦¬λ(νμλ²) λμ ν© ν¬ν¬μΈν°(λ ν¬μΈν°) μμμ λ ¬ DP μ¬ν μ°κ²° μ±λΆ (Connected Component) λ€μ΅μ€νΈλΌ νλ‘μ΄λ μμ¬ λ²¨λ§ ν¬λ μ λμ¨-νμΈλ (Disjoint set) MST(μ΅μ μ€ν¨λ νΈλ¦¬) νλ¦Ό ν¬λ£¨μ€μΉΌ μΈκ·Έλ¨ΌνΈ νΈλ¦¬ νΈλΌμ΄ μ΄λΆ κ·Έλν(Bipartite Graph). KMP CS CS κΈ°μ΄ μ§μ
[μΈλ¦¬μΌ] λ€μ ν±μ νΉμ λμ μνμν€κΈ°ν΅μ¬ :1. SetTimerForNextTick μ μ¬μ©νλ€λλ‘λ μ μ’μ§ λͺ»ν μ΄μ λ‘, νΉμ λμμ λ€μ ν±μ μ€νμμΌμΌ νλ μν©μ΄ μ‘΄μ¬νλ€.AActor* actor = GetActor();// νμ΄λ¨Έλ ν΄λ¦¬μ΄ μ²λ¦¬νκ³ λ€μ ν±μ λμ€ν° μ‘ν°λ₯Ό νΈμΆClearTimerEvent();GetWorld()->GetTimerManager().SetTimerForNextTick([actor]() { actor->Destroy(); }); κ·Έλ΄λλ, μ ν¨μλ₯Ό μ¬μ©νλ©΄ λλ€. μΈλ¦¬μΌ κΈ μ€ μ μΌ μ§§μ κΈμΈ λ― νλ€. π