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

k ch님의 프로필 이미지
k ch

작성한 질문수

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

PacketSession

안녕하세요 강의 잘듣고있습니다~ [해결했습니다]

작성

·

32

·

수정됨

0

PacketSession OnRecv 마지막부분에

image.png

buffer에서 패킷의 사이즈 만큼 자르고

buffer의 사용하지 않은부분은 buffer에 다가 새로 만들어서 넣어주고 있는데요

여기서 저걸 왜 다시 넣어야 하는지 이해가 안갑니다.

왜냐하면 읽은 데이터량만큼 processLen을 증가시켰고

processLen을 반환하면 read커서가 그만큼 증가하게 되고

image.png

이부분에서 readPos증가한만큼 new로 새로 만들어서 가져오는데 말이죠..

 

굳이 필요가 없을거 같은데 맞나요..?

답변 2

0

k ch님의 프로필 이미지
k ch
질문자

계속 생각해보니 buffer를 새로 찝어줘야 while반복문을 타서

image.png

위로 올라가 또다시 다음패킷을 헤더부터 파싱하는거였습니다.

 

0

안녕하세요, 인프런 AI 인턴입니다. k ch님이 질문하신 내용은 패킷 처리 시 ArraySegment를 사용하여 데이터를 관리하는 부분에 대한 이해를 돕기 위한 것입니다.

우선, ArraySegment<byte>는 배열의 특정 부분을 참조하게 해주는 구조체입니다. 이를 통해 메모리를 효율적으로 관리하면서도 데이터의 부분을 ‘찝어서’ 사용할 수 있습니다.

질문 주신 부분에서 ArraySegment<byte>를 사용해 특정 데이터를 다시 버퍼에 만들어 넣는 것은, 읽어들인 데이터를 명확하게 구분하여 처리할 수 있도록 하기 위함입니다. 즉, 패킷의 시작과 끝을 명확히 하고, 나중에 어떤 데이터가 처리되었는지를 추적할 수 있도록 하는 것입니다. 다만, processLen을 사용하여 이미 읽은 만큼의 데이터를 처리했음을 기록하고, 이에 따라 readPos가 이동하여 다음 데이터 처리가 이루어질 수 있도록 하는 역할을 하고 있습니다.

이러한 구조는 나중에 여러 패킷이 분할되어 오거나, 여러 개의 연속된 패킷을 받아 처리해야 할 때 명확하게 데이터를 관리하는 데 큰 도움이 됩니다. 그래서 ArraySegment를 사용하는 것이구요, 직접적으로 필요 없을 것처럼 보이지만, 코드 유지보수와 확장성을 위해 이러한 설계를 선택하는 것이 일반적입니다.

더 구체적인 설명이나 추가적인 질문이 필요하시면, 학습 자료를 함께 검토해 보시면 이해에 더 도움이 되실 것 같습니다.

유사한 질문과 답변은 다음 링크들에서 확인해보실 수 있습니다:
- RecvBuffer
- 패킷조립순서
- 9분 OnRecv질문입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

k ch님의 프로필 이미지
k ch

작성한 질문수

질문하기