ServerProgramming25 03_04_패킷 직렬화_Serialization #3_string 확인 Test Q1. string의 경우 long이나 ushort와 달리 파싱할 때 문제가 있는 이유가 무엇인가? ->길이를 알지 못하기 떄문에 ToInt64나 ToInt16같은 걸 써서 파싱할 수 없다. Q2. 코드를 깔끔하게 해주기 위해 어떤 개선을 해줬는가? -> 상수를 sizeof를 이용해 바꿨고, Span의 범위를 다시 집을 때 Slice를 사용했다. Q3. string을 buffer에 밀어 넣을 때 UTF-16을 선택하는게 나은 이유는? -> C#에서 string이 기본적으로 UTF-16으로 되어 있기 때문이다. Q4. string이 몇 바이트인지 모르기 때문에 몇 바이트 짜리가 와야 성공적으로 조립을 할 수 있는건지 알기 힘들다. 이 때 해결책은? -> string의 length를 먼저 2바.. Server programming 2023. 4. 12. 03_02_패킷 직렬화_Serialization #2_자동화 확인 테스트 Q1. 어떻게 자동화를 하면 좋을까요? -> 쓰는 부분과 읽는 부분을 함수로 빼서 Packet클래스를 상속받은 PlayerInfoReq클래스에 정의해 사용합니다. Q2. Write와 Read의 다른 점은 무엇인가요? -> 전부 다 Read에서 뽑는게 아니라 size와 id는 OnRecvPacket에서 뽑고 playerId만 Read에서 뽑는다. Q3. Read에서 size와 id를 추출할 필요가 없는 이유는 무엇인가요? -> size와 id는 OnRecvPacket에서 뽑고 Read를 호출하기 때문이다. Read가 같은 buffer를 넘겨 받고 같은 프로토콜을 사용하고 있기 때문이다. Q4. Read에서 무엇을 하는가? ->PlayerInfoReq의 멤버 변수 playerId의 값을 buff.. Server programming 2023. 4. 11. 02_14_네트워크 프로그래밍_PacketSession 확인 테스트 Q1.Packet이 완전체로 왔는지 짤려서 왔는지 구분하려면 어떻게 해야 할까요? 유동적으로 커졌다 작아졌다 하는 패킷의 경우 어떻게 해야 할까요? -> 첫인자로 size를 넣어준다. (두번째 인자로 Id를 넣어준다.) Q2. Session의 Session을 상속받은 PacketSession클래스를 추가하고 OnRecv는 sealed 를 붙이고, OnRecvPacket 함수를 abostract를 붙여 새로 선언한 이유는 무엇인가요? -> PacketSession을 상속받는 애들은 이 OnRecv인터페이스가 아니라 별도로 건내주는 public abstract void OnRecvPacket();이라는 인터페이스로 받아 사용하라는 의도 Q3. PacketSession의 OnRecv에서 buffe.. Server programming 2023. 4. 8. 02_13_네트워크 프로그래밍_SendBuffer 확인 테스트 Q1. 작업한 것을 나열해 보세요. Q2. send와 recv의 다른 점은 무엇인가? Q3. 왜 sendBuffer는 sesseion안에 넣을 수 없는 걸까? Q4. sendBuffer는 clean 기능 없이 1회용으로 사용하는 이유는? Q5. SendBuffer를 보면 멀티 스레드 처리를 안해줘도 괜찮은 이유는? Q6. 왜 Server에 sendBuff가 있으면 공용이 되고, Session에 있으면 고유의 버퍼를 갖게 되는건가? 답안 1. -> Server에 Knight 클래스를 추가한다 -> Server의 OnConnected(EndPoint endPoint)의 코드를 수정한다. 메시지가 아닌 sendBuff를 생성하고, Knight를 byte[]로 전환해 Send에 전달하게 바꾼다. -.. Server programming 2023. 4. 7. 02_12_네트워크 프로그래밍_RecvBuffer 테스트 질문 Q1. RecvBuffer를 만들고 사용하기 위해 작업한 내용을 나열해 보세요. Q2. 작업한 내용을 분류해 정리해 보세요 답변 답1. ServerCore에 RecvBuffer클래스를 추가한다. public을 붙여준다. ->클래스 안에 **ArraySegment _buffer;**를 선언한다. ->int bufferSize를 인자로 받는 RecvBuffer 생성자를 만든다. new ArraySegment를 해서 강제로 할당을 해 _buffer에 대입한다. int _readPos; int _writePos; 변수를 선언한다. ->DataSize랑 FreeSize를 public int 타입의 getter-only property(읽기 전용 속성)로 선언하고 계산한 return 값을 get으로 포.. Server programming 2023. 4. 6. 02_10_네트워크 프로그래밍_Connector Q1. DummyClient와 Server에서 ServerCore를 이용해서 동작하는 프로세스를 설명해 보세요. Q2. Connector를 만들어 주는 이유를 두가지 말해 보세요. Q3. 작업한 내용을 나열해 보세요. Q4. DummyClient, Server, ServerCore Connector, ServerCoreListener, ServerCore Session이 어떻게 상호작용하며 동작하는지 설명해주세요 답 1. ServerCore에서는 Listener를 이용하여 클라이언트의 접속을 대기합니다. 클라이언트가 접속하면, Listener에서 Accept 함수를 호출하여 클라이언트와 연결된 소켓(Socket)을 생성합니다. 생성된 소켓은 Connector를 이용하여 데이터 송수신을 처리합니다. 데이터.. Server programming 2023. 4. 6. 02_09_네트워크 프로그래밍_Session #4_엔진단과 컨텐츠단 분리 Q1. 필요한 인터페이스 동작 4가지는 무엇이 있을까? Q2. Session을 상속받아 GameSession을 사용하는 이유는 무엇인가? Q3. 엔진단과 컨텐츠단으로 코드를 옮겨가며 정리해 보세요. 엔진단과 컨텐츠 단의 구분 기준은 무엇인가? Q4. 무슨 작업을 했는지 나열해 보세요. Q5. Session#1~Session#4까지 뭘 한건지 설명해 보세요 답 1. OnConnected(EndPoint endPoint); OnRecv(ArraySegment buffer); OnSend(int numOfBytes); OnDisconnected(EndPoint endPoint); 2. Session 클래스는 세션(Session)을 생성하고 관리하는 기본적인 기능을 제공합니다. 하지만 게임에 특화된 기능을 추가.. Server programming 2023. 4. 4. 02_08_네트워크 프로그래밍_Session #3_BufferList Q1. 개선을 위해 작업한 내용들을 나열해 보세요 Q2. 더 개선할 점은 뭐가 있을까? 답 1. recvArgs도 _sendArgs처럼 Session클래스로 옮기고 인터페이스를 맞춰 준다. 그로 인한 변화를 수정해 준다. 한번에 많은 _sendArgs를 보내기 위해 SetBuffer대신 BufferList를 사용한다. List _pendingList = new List();를 class Session에 만들어 주고, RegisterSend에서 _pendingList를 Clear해준 다음, while문으로 _sendQueue.Count가 0보다 클동안 _sendQueue를 Dequeue해서 하나씩 buff에 넣어주고, 그걸 _pendingList에 하나하나 Add(new ArraySegment()인터페이스.. Server programming 2023. 4. 4. 02_07_네트워크 프로그래밍_Session #2_Send Q1. SocketAsyncEventArgs 를 재사용하기 위해 어떻게 수정 했는가? Q2. OnSendCompleted에서 _sendQueue에 쌓여있으면 어떻게 했는가? Q3. 아직 부족한 점은 무엇인가? Q4. Send 함수에서 사용된 SocketAsyncEventArgs와 OnSendCompleted 함수는 어떤 역할을 하나요? Q5. 이번 시간에 한 작업을 요약해 보세요. Q1. SocketAsyncEventArgs를 재사용하기 위해서는 RegisterSend나 RegisterRecv를 호출할 때마다 새로운 SocketAsyncEventArgs 객체를 생성하는 것이 아니라, 미리 만들어 놓은 SocketAsyncEventArgs 객체를 사용하면 됩니다. 이렇게 하면 객체 생성에 따른 오버헤드가 .. Server programming 2023. 4. 4. 02_06_네트워크 프로그래밍_Session #1_Recieve Q1. 지난 시간 코드에서 반복되는 구간이 있음에도 스택 오버플로우를 크게 걱정 안해도 되는 이유는? Q2. 이용자가 늘 것을 대비하여 Listener의 Init에서 어떤 수정을 해주었는가? Q3. OnAcceptCompleted는 왜 위험존인가? Q4. Session의 Start, RegisterRecv, OnRecvComplated가 어떤 흐름으로 recieve를 비동기로 움직이게 하고 있나요? Q5. Listener에서 AcceptAsync가 완료 되면 args.AcceptSocket에 연결된 새로 만들어준 소켓을 뱉어 주고 있었다. Recieve의 경우는 이 작업이 없는 대신 무엇을 만들어줘야 하는가? Q6. 이번 시간에 한 Recieve를 분리한 작업 과정을 말해 보세요 답 최대 대기수를 뒀기 .. Server programming 2023. 4. 4. 02_05_네트워크 프로그래밍_Listener Q1. Listener를 만들었는데 Accept만 논블로킹 방식(비동기 방식)으로 만들었을 때 작동하는 흐름을 설명해 보세요. Q2. Accept 함수가 논블로킹 방식으로 작동해야 하는 이유에 대해 설명해 보세요 Q3. 클라이언트가 연결되면 Listener가 수행하는 작업에 대해 말해 보세요 Q4. 서버를 구현할 때 Listener를 사용하는 방법에 대해 말해 보세요. Q5. 작업한 과정을 말해보세요. 답 1.Listener가 비동기 방식으로 작동할 때의 흐름: Listener는 클라이언트의 연결 요청을 받아들이는 역할을 합니다. 비동기 방식으로 작동할 때에는, Listener가 연결 요청을 받으면 해당 요청을 처리하는 새로운 스레드를 생성하여 처리합니다. 이렇게 하면, 다수의 클라이언트 요청을 동시에 .. Server programming 2023. 4. 4. 01_02_멀티쓰레드_쓰레드 생성(구버전) 처음으로 멀티 스레드 환경으로 들어가 보는 거. cout (_Fx), _STD forward(_Ax)...); } thead 객체에서 만들어 줄 때 템플릿으로 받아주고 있으니 꼭 함수일 필요는 없고, 어떤 callable 타입도 받을 수 있어 functor나 lambda도 받을 수 있어. 그리고 ... 이라는 문법도 들어가 있는데 C++11추가된 variable template인데 한마디로 인자 개수가 자유자재로 변할 수 있다는 거. void HelloThread_2(int32 num) { cout Server programming 2023. 3. 12. 이전 1 2 3 다음