전체 글177 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. 03_01_패킷 직렬화_Serialization #1_기본 확인 테스트 Q1. 직렬화, 역직렬화란 무엇을 말하는 것인가? -> 어떤 인스턴스로 존재하는 애를 납작하게 만들어서 buffer안에 밀어 넣는 작업이 직렬화, byte로 되어 있는 애를 꺼내쓰는 작업을 역직렬화 Q2. DummyClient에 ServerSession, Server에는 ClientSession을 만든 이유가 무엇인가? 또 이렇게 이름을 나눈 이유는 무엇인가? -> Server에 Client의 대리인으로 있는게 ClientSession이고, Client에 Server의 대리인으로 있는게 ServerSession이기 때문이다. 이름을 나누는 이유는 나중에 분산서버를 만들게 되면 각 다른 부분을 관리하는 서버의 대리자 역할을 할 Session이 필요할 것이기 때문이다. Q3. 어떤 프로세스로 코.. 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_11_네트워크 프로그래밍_TCP vs UDP 요약: 지난 시간에는 서버와 클라이언트를 만들고 송수신 인터페이스를 구현했습니다. 이제 게임에서 문자열 대신 패킷을 사용해야 합니다. TCP 프로토콜을 사용하고 있지만, 패킷 분석과 전송에는 규약이 필요합니다. TCP와 UDP의 차이점을 알아야만 MMO를 만들 수 있습니다. TCP는 순서 보장과 분실 책임을 지지만 속도가 느리고, UDP는 순서 보장과 분실 책임이 없지만 속도가 빠릅니다. 일반적으로 MMO에서는 안정성이 중요하기 때문에 TCP가 많이 사용됩니다. 테스트 문제: TCP 프로토콜을 사용하는 경우 어떤 특징이 있나요? UDP 프로토콜의 장점은 무엇인가요? MMO 게임에서 일반적으로 어떤 프로토콜이 많이 사용되나요? 왜 그렇게 사용되나요? 답변: TCP 프로토콜은 순서 보장, 분실 책임 지기, .. 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. 이전 1 ··· 9 10 11 12 13 14 15 다음