해결된 질문
작성
·
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
이어서 들어가고 그 이유는 WSARecv를 할 때 우리가 읽어온 데이터를
어디다 쓸지 위치를 지정해주기 때문입니다.
따라서 덮어쓰는게 아니라, 첫번째 그림처럼 동작하게 됩니다.
답변 감사합니다.
RecvBuffer 에 OnWrite 와 OnRead 에서 혼동이 와서 이해를 잘 못했던거 같습니다.
PacketSession::OnRecv 이전, RecvBuffer::OnWrite에서 _writePos 의 위치가 이동한다는 것을 놓치고 있었습니다 죄송합니다.