λͺ©λ‘μ 체 κΈ (1103)
KoreanFoodie's Study

[C++ κ²μ μλ²] 5-3. Unicode ν΅μ¬ : 1. λ¬Έμμ΄μ νΈλ€λ§μλ 2κ°μ§ μμκ° μλ€. νλλ Character Set μ΄κ³ , λ€λ₯Έ νλλ Encoding μ΄λ€. 2. Unicode λ λ€μν λ¬Έμμ΄μ λμν μ μλ Set μΌλ‘, μΈμ½λ© λ°©μμ λ°λΌ UTF-8 μ΄λ UTF-16 λ±μΌλ‘ λλκ² λλ€. 3. MBCS λ λ¬Έμμ νΉμ§λ§λ€ μ¬μ©νλ λ°μ΄νΈκ° λ€λ₯Έ κ²½μ°λ₯Ό μλ―Ένλ©°, WBCS μ λͺ¨λ λ¬Έμμ΄μ΄ λμΌν λ°μ΄νΈλ₯Ό μ¬μ©νλ λ°©μμ΄λ€. μ΄λ² κΈμμλ λꡬλ μ΅μνμ§λ§ λ¬Όμ΄λ³΄λ©΄ νμ ν·κ°λ¦¬λ λ΄μ©, μ λμ½λμ λν΄ λ€μ μ§κ³ λμ΄κ°λλ‘ νκ² λ€. μΌλ¨ Unicode μ λν΄ μ λλ‘ μ΄ν΄νλ €λ©΄ λ¬Έμμ΄ μΈμ½λ©μ λ μμ, 'Character Set' κ³Ό 'Encoding' μ ꡬλΆν΄μΌ νλ€. λ¨Όμ ,..

[C++ κ²μ μλ²] 5-2. PacketHandler ν΅μ¬ : 1. λ€μν ν¨ν·μ λν μ²λ¦¬λ₯Ό λμνκΈ° μν΄μ, ν¨ν·λ³λ‘ enum μ λ§λ€κ³ , κ° enum λ³λ‘ ν¨ν·μ νΈλ€λ§νλ ν¨μλ₯Ό λ§λ€μ΄ μ£Όλ©΄ switch λ¬ΈμΌλ‘ νλ²μ μ²λ¦¬ν μ μμ κ²μ΄λ€. 2. κ°λ³ λ°μ΄ν°λ₯Ό λ£λ κ²½μ°λ Primitive Type μ μ½λ κ²½μ°μ κ±°μ λΉμ·νλ€. 벑ν°μ ν¬κΈ°λ κ°―μ μ 보λ₯Ό λ£μ΄μ£ΌκΈ°λ§ νλ©΄ ν΄κ²°λλ€! μ΄μ μκ°μλ Buffer Helper ν΄λμ€λ₯Ό λ§λ€μ΄ λ²νΌλ₯Ό μ‘°κΈ λ μ©μ΄νκ² μ½κ³ μΈ μ μλλ‘ νλ€. νμ§λ§ μμ§ λΆμ‘±νλ€! μΌμΌν μμμ κ°μΌλ‘ λ²νΌμ λ΄μ©μ μ±μ ν¨ν·μ 쑰립νκ³ λΆν΄νλ κ²λ³΄λ€, μ’ λ μ ννλ ννλ‘ ν¨ν·μ μ£Όκ³ λ°μ μ μλ κ²μ΄ μ’λ€. κ·Έλμ μ΄λ² κΈμμλ PacketHandler ..

[C++ κ²μ μλ²] 5-1. BufferHelper ν΅μ¬ : 1. Buffer λ₯Ό μ½κ² μ½κ³ μΈ μ μκ² ν΄ μ£Όλ Buffer Helper ν΄λμ€λ₯Ό λ§λ€μ΄ 보μ. 2. '>>' , '>' λ₯Ό μ€λ²λ‘λ©ν λΆλΆμ΄λ€. νμ¬ λ²νΌμμ μ½μ λΆλΆμ μ μ ν νμ μΌλ‘ μΊμ€ν ν΄ μ½μ΄λΈ ν, _pos λ₯Ό μ΄λμν€λ©΄, μ°μν΄μ '>>' μ°μ°μ μνν μ μλ€. μ€μ μμλ μλ λΆλΆμ DummyClient ν΄λμ€λ₯Ό ν΅ν΄ νμΈν μ μμ κ²μ΄λ€ π BufferReader.cpp BufferReader::BufferReader() { } BufferReader::BufferReader(BYTE* buffer, uint32 size, uint32 pos) : _buffer(buffer), _size(size), _pos(po..

[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 -..