지우너

[C# 게임서버] 네트워크 프로그래밍(3) 본문

Programming/Server

[C# 게임서버] 네트워크 프로그래밍(3)

지옹 2024. 1. 22. 22:25

1. Session #3 

SendAsync() 호출 횟수 줄이기

 

지난 시간에 했던 내용 중 하나는 recvArgs와 sendArgs를 사용하는 방법이었다. 이 부분이 굉장히 중요한데 나중에 C++서버를 만들 때도 진짜 비슷하게 만들게 될 거니까 이 부분을 유심히 살펴보면 좋을 것 같다.

 

중요했던 것 중 하나는 SetBuffer를 하는 부분

Receive 같은 경우 초기에 recvArgs.SetBuffer(new byte[1024], 0, 1024); 이렇게 빈 버퍼를 연결만 해주었다. 그러면 나중에 클라이언트 쪽에서 데이터를 우리에게 보내고, 그 데이터가 우리가 연결한 버퍼에 저장이 된다.

Send 같은 경우, 얘도 같은 인터페이스인 SetBuffer를 사용하기는 하는데, 얘가 SetBuffer를 하는 건 실제 우리가 보낼 데이터가 있는 버퍼에다가 그 버퍼의 길이를 넣어준 것이다(_sendArgs.SetBuffer(buff, 0, buff.Length);).

 

우선 인터페이스를 맞춰주기 위해 recvArgs를 클래스의 멤버변수로 만들어 주자. RegisterRecv()는 그럼 매개변수가 필요없어진다. 관련 사항들을 수정해줄 것(빨간 박스로 체크한 부분이 수정된 부분).

 

 

 

1.1. SocketAsyncEventArgs.BufferList로 SendAsync 최적화하기

 

1.1.1. BufferList 올바른 사용법: List<ArraySegment<byte>> 만들어서 대입

SocketAsyncEventArgs.BufferList Property

 

SocketAsyncEventArgs.BufferList Property (System.Net.Sockets)

Gets or sets an array of data buffers to use with an asynchronous socket method.

learn.microsoft.com

 

더보기

ArraySegment<T> Struct

 

ArraySegment<T> Struct (System)

Delimits a section of a one-dimensional array.

learn.microsoft.com

 

위 ArraySegment<T> Struct 링크에 있는 예제 코드가 ArraySegment를 이해하는 데에 도움이 될 것 같아 가볍게 정리해봤다.

 

1.1.2. List<ArraySegment<byte>>를 멤버변수로 만들기

 

 

1.2. 코드 흐름 중간 점검

1.2.1.Send(), RegisterSend()

 

1.2.2. OnSendCompleted()

 

1.3. 남아 있는 문제점

 

 

2. Session #4

엔진과 컨텐츠 분리하기. 컨텐츠를 만들 때 그 존에 있는 모든 행위를 다 기록해서 한 번에 모아보내도록 수정하고 싶으니까.

 

 

 

정리 및 남아있는 문제점

 

 

 

 

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

@livelyjuseok

[Swift] Struct와 Class를 메모리 원리부터 자세하게 비교해보자

[C#] Func와 Action에 대해 알아보자