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

강형규님의 프로필 이미지
강형규

작성한 질문수

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

RecvBuffer

receiveBuffer 부분 질문있습니다.

작성

·

364

·

수정됨

0

  1. ReceiveBuffer 강의 듣는중 의문이 있어 문의드려요.

 

TCP로 통신을할 경우 커널단에서 패킷 전체가 전송이 완료된후 OnReceive가 일어나는것으로 이해하고 있었는데

해당강의 에서는 어플리케이션단에서 전체 패킷이 다 들어왔는지 확인 후 처리를 하는 로직이 들어가는거 같아 혼돈이 오는것 같습니다.

 

제가 이해한게 잘 못 되었을까요?

TCP 단에서 전체 패킷이 다 도착한 후 OnReceive가 일어나는게 맞다면 어플리케이션단에서 다시 한번 확인 후 처리하는 이유가 있을까요?

 

  1. PacketSession에서 마지막에 client에서 데이터를 쓰기위해 sendBuffer에서 사용할 영역을 예약하는 open에 문의 사항이 있습니다.

1) 강의대로 따라 하게되면 client에서 open(4096)을 하면 불필요하게 필요이상으로 버퍼를예약해서 실제 사용하지도 않지만 많이 예약하게되 _usedSize보다크게 되면서 계속해서 버퍼를 새로 만드는것으로 보이는데 실제 프로젝트에서는 필요한 사이즈만큼만 예약하게 되나요?

 

2) snedBuffer.Close() 에서 usedSize가 강의 에서는
_usedSize = usedSize로 되어있는데 이러면 계속 같은 버퍼 공간에 덮어 씌어질거같은데
_usedSize += usedSize로 되야 할거 같은데 이부분은 제가 잘못 이해 한건지 아니면 오타일까요?

답변 1

1

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

극단적으로 유저단에서 100바이트를 보냈지만,
그것이 커널단에선 Congestion Control에 의해
20바이트씩 5번에 걸쳐 전송될 수 있고요.
이 20바이트 전송이 TCP 프로토콜에 의해 보장이 되는 것은 맞고,
상대방한테 다 도달하면 상대방한텐 OnRecv가 뜨겠지만
그것이 꼭 최초로 유저레벨에서 보낸 100바이트라는 보장은 없습니다.

SendBufferChunk는 C++에서 보통 사용하는 방법인데
추후 이 부분은 그냥 더 간략하게 매 번 new하는 것으로 대체됩니다.

강형규님의 프로필 이미지
강형규

작성한 질문수

질문하기