• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

13:25에서 강제로 ushort(4)로 조작하는 부분에서 질문있습니다.

21.06.09 16:36 작성 조회수 222

0

13:25에서 패킷 size를 강제로 ushort(4)로 조작하는 부분에서 이해가 안가는 부분이 있습니다. size를 조작해도 playerId가 정상적으로 출력되는 이유를 아래와 같이 정리해봤습니다.

여기서 궁금한 점이 OnRecv()에서 패킷의 헤더를 확인했을 때 4바이트라고 조작되어 왔기 때문에 while문을 3번 돌지 않을까 라는 생각이 들었는데, 실행 결과를 보니 그런거 같지는 않아서 제가 잘못 이해한 부분이 있는건가 여쭤보고 싶습니다!

답변 1

답변을 작성해보세요.

0

이해하신 것이 맞습니다.
초과해서 데이터를 사용하더라도 딱히 서버에서 체크를 하지 않기 때문에,
그리고 실제로 버퍼에 데이터는 12바이트가 있기 때문에
아무런 위화감 없이 통과되고 있는 것입니다.

박준영님의 프로필

박준영

질문자

2021.06.09

아 제가 질문을 좀 잘못한 것 같습니다.

PacketSession의 OnRecvPacket을 하는 부분에서 BreakPoint를 잡고 실행해봤는데요, dataSize가 4기 때문에, RecvBuffer에 들어있는 데이터 중 앞의 4바이트 크기의 ArraySegment를 집어줘서 OnRecvPacket()으로 넘겨준다고 생각했습니다. 위에 dataSize도 4인 것으로 확인을 했구요.

그런데 F11로 다음 코드를 실행해보니 아래와 같이 OnRecvPacket()에 14바이트(?) 버퍼가 들어왔더라구요..? (12바이트도 아니고 14바이트라니...)

제가 이해한것으로 설명해보자면 OnRecvPacket()에는 4바이트짜리 버퍼만 들어와야 할 것 같은데 이 부분이 헷갈립니다ㅠㅠ

ArraySegment는 실제 데이터를 조작하는 것은 아니고
배열의 영역을 '찝어주는' 개념입니다.
ArraySegment는 Array, Offset, Size 3개의 정보를 토대로 정보를 인지하는 것이고
Array 배열 전체가 유효 데이터가 아니고
offset부터 size만큼이 유효하다고 생각해야 합니다.
따라서 전체 데이터는 여전히 12바이트이지만,
Offset = 0, Size = 4로 내부적으로 넘겨준 상태이니
원래라면 Size = 4 를 초과해서 사용하면 안되는 것입니다.

박준영님의 프로필

박준영

질문자

2021.06.09

그런 개념이었다니 한참을 잘 못 이해하고있었네요ㅠㅠㅠ 답변 감사드립니다!!