#pragma once
enum
{
S_TEST = 1 // 패킷 ID: 1 (서버 -> 클라이언트 테스트 패킷)
};
struct BuffData
{
uint64 buffId; // 버프의 ID
float remainTime; // 남은 시간
};
class ServerPacketHandler
{
public:
static void HandlePacket(BYTE* buffer, int32 len);
static SendBufferRef Make_S_TEST(uint64 id, uint32 hp, uint16 attack, vector<BuffData> buffs);
};
enum
S_TEST = 1은 테스트 패킷 ID입니다.BuffData 구조체
buffId: 버프의 고유 ID. remainTime: 버프의 남은 시간.HandlePacket 함수
Make_S_TEST 함수
void ServerPacketHandler::HandlePacket(BYTE* buffer, int32 len)
{
BufferReader br(buffer, len); // 버퍼를 읽기 위한 BufferReader 생성
PacketHeader header;
br.Peek(&header); // 헤더만 읽음 (커서는 이동하지 않음)
switch (header.id)
{
default:
break; // 정의된 패킷 ID가 아니면 무시
}
}
id와 size를 포함한 구조체입니다. br.Peek(&header): 헤더를 읽되 커서는 이동하지 않음. default 처리만 있고, 이후 다양한 패킷을 추가하면 여기에 분기 처리를 추가할 수 있음.SendBufferRef ServerPacketHandler::Make_S_TEST(uint64 id, uint32 hp, uint16 attack, vector<BuffData> buffs)
{
SendBufferRef sendBuffer = make_shared<SendBuffer>(4096); // 4KB 버퍼 생성
BufferWriter bw(sendBuffer->Buffer(), sendBuffer->Capacity()); // 버퍼에 데이터를 쓰기 위한 BufferWriter
PacketHeader* header = bw.Reserve<PacketHeader>(); // 헤더를 위한 공간 확보
bw << id << hp << attack; // id(uint64), 체력(uint32), 공격력(uint16)
// 가변 데이터
bw << (uint16)buffs.size(); // 버프 개수 저장
for (BuffData& buff : buffs)
{
bw << buff.buffId << buff.remainTime; // 각 버프 데이터를 저장
}
header->size = bw.WriteSize(); // 패킷 전체 크기 설정
header->id = S_TEST; // 패킷 ID 설정
sendBuffer->Close(bw.WriteSize()); // 버퍼 사이즈 지정
return sendBuffer;
}
SendBuffer
4096 바이트(4KB)로 초기화.BufferWriter
Reserve
Reserve<PacketHeader>: 패킷 헤더 공간을 미리 확보합니다.Serialize
id, hp, attack은 primitive 타입이므로 바로 씀. buffs.size()).buffId와 remainTime을 씀.헤더 설정
header->size: 전체 패킷 크기. header->id: 패킷 ID (S_TEST).버퍼 닫기
sendBuffer->Close: 버퍼의 쓰기 크기를 확정.#pragma once
enum
{
S_TEST = 1
};
class ClientPacketHandler
{
public:
static void HandlePacket(BYTE* buffer, int32 len);
static void Handle_S_TEST(BYTE* buffer, int32 len);
};
HandlePacket에서 패킷 ID를 확인하고 Handle_S_TEST 등 적절한 함수를 호출합니다.void ClientPacketHandler::HandlePacket(BYTE* buffer, int32 len)
{
BufferReader br(buffer, len); // 버퍼를 읽기 위한 BufferReader 생성
PacketHeader header;
br >> header; // 헤더를 읽음 (커서 이동)
switch (header.id)
{
case S_TEST:
Handle_S_TEST(buffer, len); // S_TEST 패킷 처리
break;
}
}
br >> header를 통해 헤더 데이터를 읽음. S_TEST ID면 Handle_S_TEST 호출.void ClientPacketHandler::Handle_S_TEST(BYTE* buffer, int32 len)
{
BufferReader br(buffer, len);
PacketHeader header;
br >> header;
uint64 id;
uint32 hp;
uint16 attack;
br >> id >> hp >> attack;
cout << "ID: " << id << " HP : " << hp << " ATT : " << attack << endl;
vector<BuffData> buffs;
uint16 buffCount;
br >> buffCount; // 버프 개수 읽기
buffs.resize(buffCount);
for (int32 i = 0; i < buffCount; i++)
{
br >> buffs[i].buffId >> buffs[i].remainTime; // 버프 데이터 읽기
}
cout << "BufCount : " << buffCount << endl;
for (int32 i = 0; i < buffCount; i++)
{
cout << "BufInfo : " << buffs[i].buffId << " " << buffs[i].remainTime << endl;
}
}
br >> header. id, hp, attack. buffCount를 읽어 버프 개수를 확인. buffs.resize(buffCount)로 벡터 크기 조정. buffId와 remainTime을 읽어 벡터에 저장. 확장성
가변 데이터 지원
정형화된 구조
BufferReader와 BufferWriter를 통해 데이터 읽기/쓰기가 일관되게 처리됨.