๋ชฉ๋ก์ ์ฒด ๊ธ (1096)
KoreanFoodie's Study
[C++ ๊ฒ์ ์๋ฒ] 5-7. Protobuf ํต์ฌ : 1. protobuf ๋ ๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ๋ฅผ ์ง๋ ฌํํ๋ ๋ฐฉ์์ผ๋ก, ๊ตฌ๊ธ์์ ์ ๊ณตํ๋ ํด์ ์๋ฏธํ๊ธฐ๋ ํ๋ค. 2. protobuf ๋ฅผ ์ฌ์ฉํ๋ฉด ์์ ๊ฐ์ฒด์ ๋ํ ๋ณต์ฌ๋ ๋ฐ์ํ ์๋ ์์ผ๋, ์ง๋ ฌํ์ ์ญ์ง๋ ฌํ ๊ณผ์ ์ด ๋งค์ฐ ํธ๋ฆฌํด์ง๋ค๋ ์ฅ์ ์ด ์๋ค. 3. protobuf ๋ ์ธํฐํ์ด์ค๊ฐ ๊ฐ๋จํ๊ณ ๋ช ํํ๋ฉฐ, ๋ค๋ฅธ ์ธ์ด ๋ฐ OS ๋ฅผ ์ฌ์ฉํ๋ ํ ์๋ฒ์์ ์ฐ๋์ด ์ฌ์ ํ์ ์๋ ๋งค์ฐ ์ ๋ฆฌํ๋ค. ์ด๋ฒ ์๊ฐ์๋ ๊ตฌ๊ธ์์ ๋ง๋ ๋ฐ์ดํฐ ์ง๋ ฌํ ํด์ ์ง๊ธ๊น์ง ๋ง๋ ์ํ ํ๋ก์ ํธ์ ์ ์ฉํด ๋ณผ ๊ฒ์ด๋ค. ์ด๋ฒ์๋ ๊ฒฐ๊ณผ๋ง ๋ณด์ฌ์ฃผ๋ ๊ฒ์ด ์๋๋ผ, ์ค์น ๋ฐ ์ธํ ํ๋ ๊ณผ์ ์ ์์ธํ ๊ธฐ๋กํ ๊ฒ์ด๋, ์ถํ ์ธํ ์ ์ด๋ ค์์ ๊ฒช์ ๋ ์ด ๊ธ์ด ๋์์ด ๋์์ผ๋ฉด ์ข๊ฒ ๋ค. ๐ค ๋จผ์ , protobu..
[C++ ๊ฒ์ ์๋ฒ] 5-6. ํจํท ์ง๋ ฌํ #3 ํต์ฌ : 1. ๊ฐ๋ณ ๋ฐ์ดํฐ ์์ ๊ฐ๋ณ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๋ ๊ฒฝ์ฐ๋, ๊ฒฐ๊ตญ Offset ๊ณผ Count ๋ฅผ ์ด์ฉํด ๋ฒํผ์ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋กํ๋ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ๋ค. 2. ์ถํ์ ์๊ฐํ ProtoBuf ๋ฅผ ์ด์ฉํ๋ฉด, ํจํท์ ๋ง๋ค ๋ ๊ฐ๋ณ ๋ฐ์ดํฐ๋ฅผ ์ผ์ผํ ์ฝ๋๋ก ๋ฃ๋ ๊ท์ฐฎ์์ ์ค์ผ ์ ์๋ค(๋ค๋ง ๋ถํ์ํ ๋ณต์ฌ๊ฐ ์์ ์๋ ์์). ์ ๋ฒ์๋ ๊ฐ๋ณ ๋ฐ์ดํฐ๋ฅผ ํจํท์ ๋ฃ์ด ๋ณด์๋๋ฐ... ๋ง์ฝ ๊ฐ๋ณ ๋ฐ์ดํฐ ์์ ๋ ๊ฐ๋ณ ๋ฐ์ดํฐ๊ฐ ์๋ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น? ์๋ฅผ ๋ค์ด, BuffListItem ์ด๋ผ๋ ๊ตฌ์กฐ์ฒด์ ํด๋น ๋ฒํ์ ๋์๋ค ์ ๋ณด(Victims ๋ผ๊ณ ํ์)๋ฅผ ๋ด๋๋ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น? struct BuffsListItem { uint64 buffId; float remainTime;..
[C++ ๊ฒ์ ์๋ฒ] 5-5. ํจํท ์ง๋ ฌํ #2 ํต์ฌ : 1. ๊ฐ๋ณ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ PacketList ๋ฅผ ๋ง๋ค๋ฉด, ๋ฒํผ๋ฅผ ์ฝ์ ๋ ์์ ๊ฐ์ฒด๋ฅผ ์์ฑํ์ง ์๊ณ ์บ์คํ ์ ํตํด ๋ฐ์ดํฐ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฝ์ด๋ค์ผ ์ ์๋ค. ์, ์ผ๋จ ์ ๋ฒ ์๊ฐ์๋ ๊ฐ๋ณ ๋ฐ์ดํฐ ํ์์ธ buffs ์ ๋ํด ํจํท ์ง๋ ฌํ๋ฅผ ์ํํ์๋ค. ๊ทธ๋ฐ๋ฐ ์ฝ๋๋ฅผ ์ ๋ณด๋ฉด, ์กฐ๊ธ ๋ง์์ ๋ค์ง ์๋ ๋ถ๋ถ์ด ์๋ค. vector buffs; buffs.resize(pkt.buffsCount); for (int32 i = 0; i > buffs[i]; ๋ฐ๋ก buffs ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ๋ ์์ ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ ๊ฒ์ธ๋ฐ... ์๊ฐํด๋ณด๋ฉด ๊ตณ์ด ๊ทธ๋ด ํ์๊ฐ ์๋ ์ถ๋ค. ๐ค ์ด ๋ถ๋ถ์ ์ต์ ํํ๊ธฐ ์ํด, ์ด๋ฒ ๊ธ์์..
[C++ ๊ฒ์ ์๋ฒ] 5-4. ํจํท ์ง๋ ฌํ #1 ํต์ฌ : 1. ํจํท ์ง๋ ฌํ๋, ํฌ์ธํฐ ๋ฐ ๊ฐ๋ณ ๋ฐ์ดํฐ ์ ๋ณด๋ฅผ ํจํท์ผ๋ก ์ฃผ๊ณ ๋ฐ์ ๋ ์ด๋ฅผ ์์ ํ๊ฒ ์ ์ฅํ๊ณ ๋ถ๋ฌ์ฌ ์ ์๋๋ก ํ์ฑํ๋ ๊ธฐ๋ฒ์ด๋ค. 2. ๊ฐ๋ณ ๋ฐ์ดํฐ์ ๊ฒฝ์ฐ, Offset ๊ณผ Count ๋ฅผ ์ด์ฉํด ์ง๋ ฌํ๋ฅผ ์ฝ๊ฒ ์งํํ ์ ์๋ค. 3. ์ง๋ ฌํ๋ ๋ฐ์ดํฐ๋ xml ๋๋ json ํฌ๋งท์ผ๋ก ์ธ์ด๋ธ & ๋ก๋๋ฅผ ํ๋ฉฐ ๊ด๋ฆฌํ๊ฒ ๋๋ค. xml ์ ๊ฐ๋ ์ฑ์ด ์ข์ ์ ์์ผ๋ ๋ณต์กํ๋ฉฐ, json ์ ํํ๊ฐ ๊ฐ๋จํ๋ฉฐ ํ์ฑ ์๋๊ฐ ๋น ๋ฅด๋ค. ์ด๋ฒ ๊ธ์์๋ ํจํท ์ง๋ ฌํ์ ๋ํด ์์๋ณด์. ์์ด๋ก๋ ์ฌ์ค Serialization ์ธ๋ฐ, ์ง๋ ฌํ๋ผ๊ณ ํ๋ ์ด์ง ์ด์ํ๊ฒ ๋๊ปด์ง๊ธฐ๋ ํ๋ค. ๐ ์ธ๋ฆฌ์ผ์์๋ Serialization ์ด๋ผ๋ ์ฉ์ด๋ฅผ ์ฌ์ฉํ๋๋ฐ, ๊ทธ ๋๋ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ณ ..
[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..