이번 시간에는 단순히 데이터를 주고 받는게 아닌 패킷안에 여러 데이터를 넣어놓고 주고받는식으로 설계하려고한다.
HeaderSize : 패킷에서 가장 첫부분은 패킷의 사이즈를 담은 데이터를 보내준다. 2로설정해놓았다는건 2byte =16bit로 표현된 패킷의 전체 크기가 들어있다는 뜻이다. 만약 사이즈가 8이라면 전체 크기가 8byte라는 뜻이고, 앞으로 6byte가 더 도착해야 해당 패킷을 전부 수신한것으로 처리 할 수있다.
while문 내부
1.if (buffer.Count < HeaderSize)
break;
-> 가장 앞에있는 사이즈 크기 데이터조차 오지 않았으니 break;
2.if (buffer.Count < dataSize)
break;
->전체 패킷이 오지 않았으니 break;
3. OnRecvPacket(new ArraySegment<byte>(buffer.Array,buffer.Offset,dataSize));
processLen += dataSize;
buffer = new ArraySegment<byte> (buffer.Array,buffer.Offset + dataSize, buffer.Count - dataSize);
-> 다 왔으면 조립가능한 상태이므로 보내주고 버퍼 시작점과 여유공간을 새로 설정해줌
public abstract class PacketSession : Session
{
public static readonly int HeaderSize = 2;
//패킷에서 처음 오는정보를 size로 둬서 패킷의 크기가 얼마인지를 먼저 파악하게 해줌
//sealed : 해당버전의 함수를 자식에서 ovveride못하게 막음
public sealed override int OnRecv(ArraySegment<byte> buffer)
{
int processLen = 0;
while (true)
{
if (buffer.Count < HeaderSize)
break;
ushort dataSize = BitConverter.ToUInt16(buffer.Array, buffer.Offset);
//패킷이 다 안옴
if (buffer.Count < dataSize)
break;
//여기까지 왔으면 조립가능한상태
//ArraySegment는 struct라서 new해줘도 heap에 할당안함
OnRecvPacket(new ArraySegment<byte>(buffer.Array,buffer.Offset,dataSize));
processLen += dataSize;
buffer = new ArraySegment<byte> (buffer.Array,buffer.Offset + dataSize, buffer.Count - dataSize);
}
//처리한 바이트 수 반환
return processLen;
}
public abstract void OnRecvPacket(ArraySegment<byte> buffer);
}'서버 공부' 카테고리의 다른 글
| [서버 공부]18. Packet Generator 3,4,5,6 (0) | 2025.01.27 |
|---|---|
| [서버 공부]17.Packet Generator 1,2 (0) | 2025.01.24 |
| [서버 공부]15.SendBuffer (0) | 2025.01.15 |
| [서버 공부]14. RecvBuffer (0) | 2025.01.15 |
| [서버 공부]12 Session 1,2 (0) | 2025.01.12 |