inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

Serialization #2

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

327

박준영

작성한 질문수 23

0

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

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

unity network C#

답변 1

0

Rookiss

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

0

박준영

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

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

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

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

1

Rookiss

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

0

박준영

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

TLS 질문드립니다.

0

51

2

SpinLock과 컨텍스트스위칭에 대해 질문 남겨요.

0

54

2

Unity Span

0

80

2

XML, Dll 차이점

0

109

2

Session 질문입니다

0

81

1

Write Read 커서 키워드

0

77

1

더미 클라이언트 수에 따른 OnDisconnect 발생

0

73

2

네트워크 Send 전담 스레드 배치

0

99

2

UnhandledException 으로 서버 터지는 경우

0

88

2

컨텐츠 단, 엔진 단

0

106

1

질문 있습니다

0

77

2

C# 게임서버 3D MMORPG

0

150

2

유니티6 버전

0

99

2

receive하는 부분과 send하는 부분의 차이

0

134

2

커서의 위치의 중요성

0

104

2

C++ 전혀 모르는데 C# 서버

0

170

2

강의에 질문이 있습니다

0

86

2

멀티스레드 이해도 질문

0

96

1

500 vs 500

0

130

3

OnAcceptHandler 액션 함수

0

64

1

이 정도 서버의 객관적인 수준이 궁금합니다.

0

193

2

36. Serialization #3 에서 string (name) 코드 수정 질문

0

83

2

외부 컴퓨터와의 통신 방법이 궁금합니다

0

107

1

스핀락 질문.

0

110

2