λͺ©λ‘μ 체 κΈ (1096)
KoreanFoodie's Study
[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 μ μ¬μ©νλ€ λλ‘λ μ μ’μ§ λͺ»ν μ΄μ λ‘, νΉμ λμμ λ€μ ν±μ μ€νμμΌμΌ νλ μν©μ΄ μ‘΄μ¬νλ€. κ·Έλ΄λλ, μλ ν¨μλ₯Ό μ¬μ©νλ©΄ λλ€. μΈλ¦¬μΌ κΈ μ€ μ μΌ μ§§μ κΈμΈ λ― νλ€. π
[C++ κ²μ μλ²] 4-2. IocpCore ν΅μ¬ : 1. IOCP λͺ¨λΈμ ν° κ·Έλ¦Όμ μ΄ν΄νλ κ²μ΄ μ€μνλ€. Completion Port, Socket, Session λ±μ κ°λ μ μ μμλμ. 2. μμΌλ‘λ IocpCore λ₯Ό νμ©νμ¬ API λ₯Ό μΊ‘μνν API λ₯Ό μ¬μ©ν κ²μ΄λ€. IocpCore λ IocpObject λ₯Ό κ°μ μ μΌλ‘ νμ©νλ€. 3. OVERLAPPED λ₯Ό μμλ°μ IocpEvent μ, HANDLE μ νΈλ¦¬νκ² μ¬μ©ν μ μλ IocpObject λ₯Ό μμλ°μ μΈλΆ μ¬νμ ꡬνν κ²μ΄λ€. μ΄μ IOCP λͺ¨λΈμ ꡬνν¨μ μμ΄ μ€κ³§ μ¬μ©ν IOCP κ΄λ ¨ κ°μ²΄λ€μ λ§λ€μ΄λ³΄μ. μ¬μ€ IocpCore λΌκ³ κ±°μ°½νκ² μ΄λ¦μ μ§μμ§λ§, μ€μ κΈ°μ‘΄μ μ¬μ©νλ HANDLE, Socket, Sessi..
[C++ κ²μ μλ²] 4-1. Socket Utils ν΅μ¬ : 1. IOCP μλ² κ΅¬μΆμ μν΄, ::InetNtopW, ::setsockopt ν¨μ λ±μ νμ©νμ¬ νμν λ€νΈμν¬ ν¨μλ€μ Wrapping ν ν¬νΌ ν¨μλ€μ λ§λ€μ΄ 보μ. 2. μμΌμ μ¬μ©ν λ, Connect/Disconnect/Accept μ ν΄λΉνλ ν¨μ ν¬μΈν°λ₯Ό λ§λ€κ³ , μμΌκ³Ό λ°μΈλ©νμ¬ ν΄λΉ μ£Όμλ₯Ό μ»μ΄ μ κ°νΈνκ² μ¬μ©ν μ μλ€. ::WSAIoctl ν¨μλ₯Ό μ°Έκ³ νμ. μ΄λ² 4 μ±ν°λ, λ€νΈμν¬ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ μνλ λΆλΆμ΄λ€. μ¬μ€ μ΄λ² μ±ν°λ μ‘°κΈ μμν΄ λ³΄μ΄λ API λ€μ μ¬μ©νλ©΄μ, μμΌλ‘ ꡬμΆν IOCP μλ²λ₯Ό μν λ°μμ μ νλ λΆλΆμ΄λ€. κ·Έλ¬λ λ―μ€μ΄ 보μ΄λ λ μλ€μ΄ λ§μ΄ 보μ΄λλΌλ 'κ·Έλ €λ €λ...' νλ©΄μ, λ¬Έμλ₯Ό 보..
[C++ κ²μ μλ²] 3-12. Completion Port λͺ¨λΈ ν΅μ¬ : 1. IOCP λͺ¨λΈμ μ€λ λλ§λ€ κ°κ³ μλ APC λμ , Completion Port λ₯Ό μ€μμμ νλ κ΄λ¦¬νλ€. 2. μ€λ λλ Alertable Wait μνλ‘ λμ νλ κ² λμ , μλ²λ κ²°κ³Όλ₯Ό μ²λ¦¬ν μ μμ λ GetQueuedCompletionStatus λ₯Ό νΈμΆνμ¬ μ 보λ₯Ό μ‘°νν΄ μλ§μ λμμ μννλ€. 3. λ§μ½ νΉμ μ°λ λκ° νΉμ μ΄λ²€νΈλ₯Ό ν λ² λ λ°κΈΈ μνλ€λ©΄, iocpHandle κ³Ό λ°μΈλ©ν ν¨μ λ΄λΆμμ WSARecv λ±μ νΈμΆν΄ μ΄λ²€νΈλ₯Ό λ λ°μ μ μλλ‘ μ€μ ν΄ μ£Όμ΄μΌ νλ€. λλμ΄... μΈλ²μ§Έ μ±ν°μ λ§μ§λ§μ΄μ μ μΌ μ€μν, IOCP λͺ¨λΈμ λν΄μ μμ보μ. λ¨Όμ , λ°λ‘ μ μ μμ보μλ Overlapped..