서버에서 사용하는 패킷 구조
전체 4096 Bytes |
|||
전체 패킷 길이 4 Bytes |
고유번호(패킷복사, 해킹방지) 4 Bytes |
프로토콜 4 Bytes | 데이터 4084 Bytes |
암호화 |
1. 전체 패킷 길이
1개의 패킷이 어디까지 인지 알려준다.
2. 고유번호
클라에서 패킷을 보낼 때 마다 하나씩 증가시키는 것이 원칙이고, 서버에서는 순차적으로 패킷이 왔는데, 만약 증가되지 않으면 복사 패킷으로 인지해서 그 패킷은 무시하게 된다.
3. 프로토콜
패킷의 용도를 담는 곳으로, 캐릭터가 이동한다던지, 공격한다던지 정해진 규칙에 따라서 패킷 내용을 채운다.
4. 데이터
프로토콜에서 정한 규칙에 따른 데이터들을 나열해 놓은 것으로, 캐릭터 이동이라면 X, Y 좌표 값이고, 공격이라면 특정 몬스터 인덱스 값, 사용되는 스킬 번호등 이러한 정보들이 담기게 된다.
대략의 코드 구조
// LENGTH(4) | PACKET_NUMBER(4) | PROTOCOL(4) | DATA (4084)
// 패킷의 전체 길이 계산
// 패킷 전체 길이 = 패킷 길이 + 패킷 고유 번호 + 프로토콜 + 데이터 길이
WORD PacketLength = sizeof(PacketLength)/*LENGTH*/ +
sizeof(DWORD)/*PACKETNUMBER*/ +
sizeof(DWORD)/*PROTOCOL*/ +
(WORD)packetLength;
// 패킷 길이가 최대 버퍼 길이보다 길면 실패함
if (PacketLength >= MAX_BUFFER_LENGTH)
return FALSE;
// 고유번호를 하나 증가시킵니다.
mCurrentPacketNumber++;
// 들어온 데이터를 이용해서 패킷을 만들기 위한 버퍼
BYTE TempBuffer[MAX_BUFFER_LENGTH] = {0,};
// 패킷을 만듭니다.
// 패킷에 인덱스를 붙여 순서 보정을 해 주어야 한다.
// [=>패킷전체길이][고유번호][프로토콜][데이터]
memcpy(TempBuffer, &PacketLength, sizeof(PacketLength));
// [패킷전체길이][=>고유번호][프로토콜][데이터]
memcpy(TempBuffer +
sizeof(WORD)/*LENGTH*/,
&mCurrentPacketNumber, sizeof(DWORD));
// [패킷전체길이][고유번호][=>프로토콜][데이터]
memcpy(TempBuffer +
sizeof(WORD)/*LENGTH*/ +
sizeof(DWORD)/*PACKETNUMBER*/,
&protocol, sizeof(DWORD));
// [패킷전체길이][고유번호][프로토콜][=>데이터]
memcpy(TempBuffer +
sizeof(WORD)/*LENGTH*/ +
sizeof(DWORD)/*PACKETNUMBER*/ +
sizeof(DWORD)/*PROTOCOL*/,
packet, packetLength);
// 보내는 데이터를 Encrypt 함수를 이용해서 암호화합니다.
CCrypt::Encrypt(TempBuffer + sizeof(DWORD), TempBuffer + sizeof(DWORD), PacketLength - sizeof(DWORD));
클라이언트와 논의 후 바뀐 패킷 구조
전체 4096 Bytes | |||
전체 패킷 길이 2 Bytes | 고유번호(패킷복사, 해킹방지) 4 Bytes | 프로토콜 4 Bytes | 데이터 4086 Bytes |
암호화 |