강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

BBAKK님의 프로필 이미지
BBAKK

작성한 질문수

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

Session의 함수 관련하여 질문드립니다.

작성

·

141

0

강의 1회 완주한 뒤 코드를 복습하면서 의문이 생겼습니다.

Session 클래스의 void OnSendCompleted(object sender, SocketAsyncEventArgs args) 메소드관련 질문드립니다.

진한 글씨체로 되있는 부분에서 비동기 전송작업에서

전송요청한 패킷의 일부만 전송되고도 OnSendCompleted 메소드가 호출 될 수 있지 않나요?

만약 맞다면 _pendingList.Clear() 를 사용해서 버퍼를 다 비워버리는것이 아니라

추가 작업을 해줘야하는 것이 아닌지 궁금합니다.

void OnSendCompleted(object sender, SocketAsyncEventArgs args)

{

lock (_lock)

{

if (args.BytesTransferred > 0 && args.SocketError == SocketError.Success)

{

try

{

_sendArgs.BufferList = null;

_pendingList.Clear();

OnSend(_sendArgs.BytesTransferred);

if (_sendQueue.Count > 0)

RegisterSend();

}

catch (Exception e)

{

Console.WriteLine($"OnSendCompleted Failed {e}");

}

}

else

{

Disconnect();

}

}

}

답변 1

1

Rookiss님의 프로필 이미지
Rookiss
지식공유자

안녕하세요,

TCP가 비록 내부적으로는 데이터를 쪼개서 보낼 수 있다고는 하지만,
어플리케이션 레벨에서 호출하는 SendAsync의 완료 통지는
(일부가 아닌) 요청한 데이터 전체가 전송 완료 되었을 때 호출됩니다.
즉 1000바이트를 보낸다고 가정하면
받는 쪽에서는 200바이트씩 쪼개서 5번에 걸쳐 올 수 있기는 하지만,
SendAsync 완료 통지는 1000바이트가 다 보내졌을 때 호출이 됩니다.
따라서 굳이 사이즈 크로스 체킹을 할 필요는 없습니다.

BBAKK님의 프로필 이미지
BBAKK

작성한 질문수

질문하기