관리 메뉴

有希

Session#3 본문

프로그래밍/C# 게임서버

Session#3

有希. 2021. 9. 9. 16:23

이전에는 Queue에서 byte[] 하나만 빼와서 하나씩 전송했는데, SocketAsynEventArgs.BufferList에 보낼 byte[]들을 넣어주면 한 번에 다 보낼 수 있다.

다만, SetBuffer와 BufferList는 하나만 사용해야 한다. RegisterSend()에서 SetBuffer를 사용하는데, 여기서 BufferList도 넣게 되면 에러가 난다. 상황에 맞게 쓰면서 수정해주자.

BufferList에 값을 넣을 때는 List로 만들어서 넣어야 한다. 전역으로 List _pendingList를 생성하고, <T>는 ArragSegment<byte>로 넣어줘야 한다.

RegisterSend에서 첫째줄에서 _pendingList를 클리어해주고 while문으로 Queue에 있는 모든 byte[]들을 꺼내온 뒤, _pendingList에 넣는다.

그리고, args.BufferList에 _pendingList를 대입해주고, SendAsync로 _sendArgs인자넣고 호출.

Send함수에서의 _pending도 _pendingList의 Count를 통해 전송중인지 아닌지 알 수 있다.(이전에 OnSendComplete에서 Queue에 값이 남아있다면 자동으로 계속 보내도록 설정해주었었다.)

다만 주의해야할 점은 Queue를 싹 비워서 다 보내고 있는데, 내가 몇 바이트 보냈는지를 체크해서 상대방이 모두 받을 수 있도록 속도를 조절해야 한다. 또, DDos공격도 있으므로 이를 감지해서 끊어버려야 한다.

 

'프로그래밍 > C# 게임서버' 카테고리의 다른 글

Connector  (0) 2021.09.17
Session#4  (0) 2021.09.09
Session#2  (0) 2021.09.09
Session#1  (0) 2021.09.09
소켓 프로그래밍 - 비동기 연결  (0) 2021.09.09