세션패킷과,버퍼 질문
357
작성한 질문수 24
//최소한 헤더는 파싱(데이터를 읽을수 있는지)할 수 있는지 확인
if (buffer.Count < HeaderSize)
break;
// 패킷이 완전체로 도착했는지 확인
ushort dataSize = BitConverter.ToUInt16(buffer.Array, buffer.Offset);
if (buffer.Count < dataSize)
break;
1.
최소한의 해더파싱은 Packet클래스의 size 는 2byte인데
완전체는 Packet클래스의 size,packet 4byte를 말하는게 아닌가요? 그럼 int로 받아야하는데 왜 ushort로 받나요?
2.
버퍼 카운터는 byte의 크기를 말하는건가요?
3.
ArraySegment<byte> openSegment = SendBufferHelper.Open(4096);
byte[] buffer =
BitConverter.GetBytes(packet.size);
byte[]buffer2 =
BitConverter.GetBytes(packet.packetId);
Array.Copy(buffer, 0, openSegment.Array, openSegment.Offset, buffer.Length);
Array.Copy(buffer2, 0, openSegment.Array, openSegment.Offset + buffer.Length, buffer2.Length);
ArraySegment<byte> sendBuff = SendBufferHelper.Close(packet.size);
코드 흐름이 이해가 안가네요 쉽게 설명해주실수 있나요?
답변 1
2
1.
2byte에 크기가 들어 있으니, 일단 2 byte 를 기다렸다
완전한 크기가 왔는지 체크하는 식으로 작업했지만
패킷 번호가 포함된 4byte를 기다려도 당연히 됩니다.
2.
네.
3.
ArraySegment<byte> openSegment = SendBufferHelper.Open(4096);
SendBuffer를 4096만큼 할당해서
[ ]
여기다가 내용물을 기입하기 시작합니다.
최종적으로
[size | packetId | 패킷 내용물 ] 요렇게 되어야 하고,
그 작업을 아래에서 해주고 있습니다.
byte[] buffer = BitConverter.GetBytes(packet.size);
byte[] buffer2 = BitConverter.GetBytes(packet.packetId);
Array.Copy(buffer, 0, openSegment.Array, openSegment.Offset, buffer.Length);
Array.Copy(buffer2, 0, openSegment.Array, openSegment.Offset + buffer.Length, buffer2.Length);
C#은 C++처럼 포인터로 얍얍 복사가 힘들기 때문에 (unsafe 모드로 하면 안되는 것은 아니지만..)
우회해서 buffer, buffer2라는 바이트 배열을 만들어서 다시 넣어주고 있습니다.
Array.Copy는 구글에 검색해서 어떻게 동작하는지 MSDN을 살펴보시기 바라며,
C++의 memcpy랑 비슷한 개념입니다.
ArraySegment<byte> sendBuff = SendBufferHelper.Close(packet.size);
최초 할당받은 4096 바이트를 다 사용하지 않았으니,
Close(packet.size)를 해줘서 사용한 만큼만 지정해서 닫아주고 있습니다.
C#에서의 RAII
0
66
3
TLS 질문드립니다.
0
79
2
SpinLock과 컨텍스트스위칭에 대해 질문 남겨요.
0
74
2
Unity Span
0
97
2
XML, Dll 차이점
0
134
2
Session 질문입니다
0
96
1
Write Read 커서 키워드
0
88
1
더미 클라이언트 수에 따른 OnDisconnect 발생
0
85
2
네트워크 Send 전담 스레드 배치
0
112
2
UnhandledException 으로 서버 터지는 경우
0
102
2
컨텐츠 단, 엔진 단
0
118
1
질문 있습니다
0
93
2
C# 게임서버 3D MMORPG
0
159
2
유니티6 버전
0
106
2
receive하는 부분과 send하는 부분의 차이
0
154
2
커서의 위치의 중요성
0
110
2
C++ 전혀 모르는데 C# 서버
0
176
2
강의에 질문이 있습니다
0
92
2
멀티스레드 이해도 질문
0
107
1
500 vs 500
0
147
3
OnAcceptHandler 액션 함수
0
70
1
이 정도 서버의 객관적인 수준이 궁금합니다.
0
204
2
36. Serialization #3 에서 string (name) 코드 수정 질문
0
86
2
외부 컴퓨터와의 통신 방법이 궁금합니다
0
112
1





