패킷 단위로 보내고 받는다면 Session이 어떻게 달라져야하는가? 서버에서 클라이언트의 데이터를 받을때 패킷 단위로 받고 클라이언트에서 패킷 단위로 보내자! 1. TCP 통신에서는 패킷이 전체가 왔는지 잘려서 왔는지 구분할 필요가 있다. -> 혼잡 제어로 인해 전체 패킷을 받는다는 보장이 x 1) packetId: id를 통해 패킷을 구분(1번: 이동 패킷, 2번: 공격 패킷, 3번: 이동패킷) -> 문제: 경우에 따라 유동적으로 packet의 사이즈가 줄어들 수 있음 ex) Packet을 상속받는 LoginOKPacket이 캐릭터가 갖는 캐릭턱 정보의 리스트를 보낸다고 할때 쉽게 Packet의 사이즈를 예측 할 수 없다. => Packet의 맨 처음에는 Packet의 사이즈를 나타낸다. 일반적으로 형..
: 클라이언트에서 서버로 메세지를 보냄 -> 서버는 메세지(패킷)을 Receive -> 컨텐츠단 ReceiveBuffer의 Byte를 읽어드린다. 1. TCP의 특징으로 인해 패킷이 분할되어 전달 받을 수 있다. : 이전 코드에서 Receive Buffer를 bytes[1024] 만큼 읽어드릴 수 있다고 간접적으로 이야기한 것 1) TCP의 특성때문에 100바이트를 보내도 80바이트 만큼 우선 보내고 나중에 나머지 20바이트가 올 수 있는 것이다. 2) 만약 80바이트만 왔다고 가정을 하면 Receive Buffer에 담고 있다가 나머지 20바이트가 왔을 때 조립하여 한번에 처리해야 한다. - 아래의 OnRecv 함수처럼 Buffer에 들어온 바이트를 무조건 한번에 처리하면 안된다. -> 완벽한 Byte..
* 통용되는 용어 x: Listener의 반대 역할을 하는 Connector 1. DummyClient에서 서버와 Connect하는 부분이 Blocking 함수로 작성 -> 지양 2. ServerCore 프로젝트 우클릭 -> 추가 -> 새항목: Connector.cs 만들어야함. : 왜 굳이 반드시 연결해야하는 코드가 필요한가? 서버는 연결을 받는 것 아닌가? 1) Connect 후 Receive와 Send하는 부분을 고용으로 사용하기 위해 2) 서버를 분산처리 하여 만들 수 있음 ex) NPC, AI만 관리하는 서버 vs 몬스터만 관리하는 서버 등으로 분리할 수 있음 -> 이럴 때, 서버끼리 통신하기 위해서는 서버도 Connect 해야 한다. 3. Connector.cs 코드 작성 1) DummyCli..
1. 이전시간 강의 회고 - Receive Buffer는 빈 Buffer로 연결 vs Send Buffer는 보낼 데이터가 담겨있는 Buffer - _sendArgs를 재사용하기 위해 클래스의 멤버 변수로 선언 -> rcvArgs도 재사용을 위해 멤버 변수로 가능(기호의 차이) using System; using System.Collections.Generic; using System.Linq; using System.Net.Sockets; using System.Text; using System.Threading; using System.Threading.Tasks; namespace SeverCore { class Session { Socket _socket; int _disconnected = 0;..
1. 이전 시간 의문 a) 만약 RegisterAccept에서 계속 pending이 false면 OnAcceptCompleted 함수와 RegisterAccept 함수가 재귀적으로 호출되어 스택오버플로우 발생? - ListenSocket의 Listen에서 backlog를 통해 최대 대기수를 정해줬기때문에 동시다발적으로 false만 뜰 수 없음 -> 의도적으로 많은 User들이 공격하지 않는 이상 발생할 수 없음 b) Listen Socket을 하나만 만들었다. -> 굉장히 많은 User가 게임에 들어와서 서버와 통신을 하려고 할때 어떻게? - SocketAsyncEventArgs를 여러개 만들 수 있다. -> SocketAsyncEventArgs는 독립적으로 실행되기때문에 아래와 같이 for 문으로 여러..
1. 이전 시간의 코드를 분리해서 정리 : Program.cs의 main 함수에 모든 것을 넣는 것이 아닌 Listener 소켓을 따로 빼어 정리 1) SeverCore 프로젝트 우클릭 -> 추가 -> 새항목 추가: Listener.cs 만들기 2) Listener 클래스에서 _listenSocket을 만든다 . 3) Init 함수를 구현하여 해당 함수 내에 _listenSocket 객체를 생성한다. -> 문지기기를 교육(endPoint 주소 할당) -> 영업을 시작하겠다는 Listen을 한다. class Listener { Socket _listenSocket; public void Init(IPEndPoint endPoint) { _listenSocket = new Socket(SocketType.S..