갑자기 서버 역량도 있었으면 좋겠다는 생각이 들었다.
그래서 책을 샀다.
책 홍보는 아니다.
그냥 내가 고른 책이다.
https://ebook-product.kyobobook.co.kr/dig/epd/ebook/E000003336670
교보문고에서 eBook 으로 샀다.
1. CNetworkService
책의 첫 장부터 다짜고짜 이 클래스를 만들기 시작한다.
.Net 에 정의된 클래스 인 줄 알았는데 그냥 직접 만든 클래스였고, 가장 메인이 되는 클래스였다.
왜 이름이 CNetworkService 인지 GPT 에게 물어보니,
C (언어 설명) + NetworkService (그냥 이름) 조합인 것 같다고 했다.
다음에는 그냥 내 마음대로 이름을 정해야겠다.
이 클래스에서는
1. 클라이언트의 접속을 받기 위한 Listener 객체
2. 메세지 송수신에 필요한 SocketAsyncEventArgsPool 2개
3. 전체 버퍼를 관리할 BufferManager
4. 클라이언트 접속 시 발생할 콜백
을 기본 구조로 선언한다.
전부 생소한 개념이었다.
2. SocketAsyncEventArgs
공부하다보니 가장 많이 마주치는 객체였다. 닷넷 기본 제공 클래스이다.
다만 이를 효율적으로 사용하기 위해 Pooling 을 사용한다.
어려울 거 없이 그냥 Pool 클래스를 하나 만들어서 Stack<SocketAsyncEventArgs> 자료구조를 선언하고,
Push(), Pop() 메서드를 구현해서 사용하면 된다.
3. Listener
listener 클래스에서는 Start() 메서드를 만들고,
해당 메서드에 접속할 서버의 IP 주소와 포트를 넘겨주고 호출하면 클라이언트가 접속할 수 있는
대기 상태로 만들어준다.
소켓을 생성할 때는 아래와 같이 생성한다.
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
InterNetwork 는 IPv4 를 의미하고, Stream 은 양방향 타입, Tcp 는 말 그대로 Tcp 를 의미했다.
소켓을 만들고, 엔드 포인트를 서버 IP 주소로 설정하고 소켓에 바인딩한다.
그리고 소켓의 Listen() 을 호출하면 대기 상태가 된다.
SocketAsyncEventArgs args = new SocketAsyncEventArgs();
args.Completed += new EventHandler<SocketAsyncEventArgs>(OnAcceptCompleted);
socket.AcceptAsync(args);
void OnAcceptCompleted(){}
Accept 가 완료될 때 할 이벤트를 하나 만들어주고, AcceptAsync() 를 호출하면,
Bind -> Listen -> Accept 의 과정이 일어난다.
여기서 AcceptAsync 를 호출할 때 해당 메인 스레드가 입력을 받는 상황처럼 스레드가 정지되는 상황에는
Accept 가 발생하지 않을 수 있으므로,
별도의 스레드를 생성해서 Accept 가 일어나도록 해야한다.
4. Thread
스레드를 생성하는 법은 다음과 같다.
Thread thread = new Thread(실행할 함수);
thread.Start();
이렇게 하면 별도 스레드에서 Accept 과정을 처리하게 만들어 메인스레드가 대기 상태에서 Accept 를 하지 못하는 상황은 해결된다.
5. AcceptAsync
닷넷의 AcceptAsync() 등의 함수를 사용할 때에는 일종의 루틴이 있다.
비동기 호출이 완료되면 true 의 bool 값을 반환하고, 동기적으로 완료되면 false 값을 반환한다.
따라서, 동기적으로 완료되었을 경우 Accept 이후의 콜백을 직접 호출할 필요가 있으므로,
반환 값을 확인하여 추가로직을 작성한다.
// 예시
bool pending = socket.AcceptAsync(args);
// ...
// ...
if (pending == false)
{
OnAcceptCompleted();
}
'게임 서버(TCP)' 카테고리의 다른 글
게임 서버 입문하기 - 2 / Disconnect 에 대하여 (2) | 2024.10.17 |
---|