인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

Kang Teahyen님의 프로필 이미지
Kang Teahyen

작성한 질문수

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

PacketSession

패킷 리시브버퍼 관련 질문이 있습니다.

해결된 질문

작성

·

369

0

패킷 리시브 할 때 WSARecv의 작동에 의문이 생겨 질문을 남겨봅니다.

 

[Size][ID][Hello World]

라는 패킷을 수신하다고 가정해봤을 때

Session::ProcessRecv 가 호출된 시점에서

 

 [Size][ID][Hello]

까지의 데이터를 받았다고 가정하면

PacketSession::OnRecv에서 dataSize가 header.size보다 작기 때문에 0바이트를 Return 해 버리고 끝납니다.

 

이러면 RecvBuffer의  _writePos,  _readPos에는 아무 변화 없이 다시 RegisterRecv를 걸어버리는데요

 

다음 RegisterRecv (WSARecv) 를 걸 때 , 읽다만 데이터의 시작 지점 부터 다시 읽어버리는게 아닌가 싶어서 여쭤봅니다

 

첫 번째 ProcessRecv를 받았을 때 RecvBuffer이 다음과 같다면

 

두 번째 ProcessRecv에서는 남은 "World" 데이터가 RecvBuffer 뒤쪽에 쌓이게 되는지, 

아니면 변하지 않은 _writepos 위치 때문에 앞에서 부터 다시 작성되게 되는지 의문이 생겨 여쭤봅니다.

 

제 생각 중

만약 전체 바이트가 아닌 일부 바이트만 수신되는 위와 같은 과정에서 WSARecv는 2번 따로 따로 호출된다고 이해한게 맞으며,

RecvBuffer에 문제없이 데이터가 이어서 들어가게 되나요?

 
 
 

답변 1

1

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

이어서 들어가고 그 이유는 WSARecv를 할 때 우리가 읽어온 데이터를
어디다 쓸지 위치를 지정해주기 때문입니다.

따라서 덮어쓰는게 아니라, 첫번째 그림처럼 동작하게 됩니다.

Kang Teahyen님의 프로필 이미지
Kang Teahyen
질문자

답변 감사합니다.

RecvBuffer 에 OnWrite 와 OnRead 에서 혼동이 와서 이해를 잘 못했던거 같습니다.

 

PacketSession::OnRecv 이전,  RecvBuffer::OnWrite에서  _writePos 의 위치가 이동한다는 것을 놓치고 있었습니다 죄송합니다.

Kang Teahyen님의 프로필 이미지
Kang Teahyen

작성한 질문수

질문하기