Refactored packet handling into packet methods.

This commit is contained in:
q3k 2012-11-28 13:25:37 +01:00
parent c8aac8900e
commit ab159a3887
9 changed files with 102 additions and 79 deletions

View file

@ -89,85 +89,12 @@ int CClientConnection::Communicate(void)
m_Buffer[i] = m_Buffer[DataStart + i];
m_BufferPosition = Result;
}
// packet received? logic time!
switch (m_CurrentPacket->GetPacketID())
{
// HANDSHAKE
case 0x02:
{
C2S02Handshake *Packet = (C2S02Handshake *)m_CurrentPacket;
LOG("Got handshake for protocol version %i\n", ((C2S02Handshake *)m_CurrentPacket)->GetProtocolVersion());
if (((C2S02Handshake *)m_CurrentPacket)->GetProtocolVersion() != 49)
{
LOG("... that's not a version we support.\n", 0);
return -1;
}
utf8str Username = Packet->GetUsername();
Username.push_back(0);
LOG(" Username: %s\n", &(Username[0]));
int Result = m_CurrentPacket->Handle(this);
//m_Client = new CClient(Username16);
m_State = HANDSHAKE;
m_InPacket = false;
SendToClient(CGenericS2CPacket::Serialize(S2CKICK, &MakeUTF8("Sorry, that doesn't work yet!")));
delete Packet;
m_InPacket = false;
m_CurrentPacket = 0;
break;
}
// SERVER LIST PING
case 0xFE:
{
C2SFEServerListPing *Packet = (C2SFEServerListPing *)m_CurrentPacket;
if (Packet->GetMagic() != 1)
{
LOG("Weird server list ping magic %i\n", Packet->GetMagic());
return -1;
}
// we have to use custom serialization code here,
// because the response contains an illegal unicode
// character;
utf8str Response;
// protocol
AppendUTF8(Response, "49");
Response.push_back(0);
// MC version
AppendUTF8(Response, "1.4.4");
Response.push_back(0);
// MOTD
AppendUTF8(Response, "A umcs server.");
Response.push_back(0);
// Player Count
AppendUTF8(Response, "0");
Response.push_back(0);
AppendUTF8(Response, "20");
Response.push_back(0);
TVector<unsigned char> Buffer;
Buffer.push_back(0xFF);
unsigned int Length = Response.size() + 3;
Buffer.push_back(Length >> 8);
Buffer.push_back(Length & 0xFF);
Buffer.push_back(0x00);
Buffer.push_back(0xA7);
Buffer.push_back(0x00);
Buffer.push_back(0x31);
Buffer.push_back(0x00);
Buffer.push_back(0x00);
for (auto It = Response.begin(); It != Response.end(); It++)
{
printf("packet %02x\n", *It);
Buffer.push_back(0);
Buffer.push_back(*It);
}
SendToClient(Buffer);
}
}
m_InPacket = false;
m_CurrentPacket = 0;
return Result;
}
else if (Result == -2)
{
@ -193,4 +120,9 @@ void CClientConnection::SendToClient(TVector<unsigned char> Buffer)
}
printf("\n");
send(m_Socket, &Buffer[0], Buffer.size(), 0);
}
void CClientConnection::SetConnectionState(EClientConnectionState State)
{
m_State = State;
}

View file

@ -19,12 +19,12 @@ namespace umcs {
IN_GAME
};
class CClientConnection {
friend class CGenericC2SPacket;
private:
CGenericC2SPacket *m_CurrentPacket;
bool m_InPacket;
CClient *m_Client;
void SendToClient(TVector<unsigned char>Bufer);
void SlideBufferWindow(unsigned int RemainingBytes);
protected:
TSocket m_Socket;
@ -37,6 +37,8 @@ namespace umcs {
TSocket GetSocket(void);
void FillReadBuffer(unsigned char *Data, unsigned int Length);
int Communicate(void);
void SetConnectionState(EClientConnectionState State);
void SendToClient(TVector<unsigned char>Bufer);
~CClientConnection(void);
};
};

View file

@ -41,6 +41,8 @@ int CServer::MakeSocketNonBlocking(TSocket Socket)
LOG("Could not set socket options...\n", 0);
return -1;
}
return 0;
}
int CServer::Run(void)
@ -54,7 +56,10 @@ int CServer::Run(void)
// make it non-blocking
if (MakeSocketNonBlocking(m_GameSocket) < 0)
{
LOG("Could not make socket non-blocking...\n", 0);
return -1;
}
// bind to inaddr_any and specified port
struct sockaddr_in Address;

View file

@ -1,6 +1,10 @@
#include "C2S02Handshake.h"
using namespace umcs;
#include "../config.h"
#include "GenericS2CPacket.h"
#include "../ClientConnection.h"
bool C2S02Handshake::ReadField(unsigned int Field)
{
switch (Field)
@ -14,4 +18,25 @@ bool C2S02Handshake::ReadField(unsigned int Field)
case 3:
return ReadInteger(m_Port);
}
}
int C2S02Handshake::Handle(CClientConnection *Connection)
{
LOG("Got handshake for protocol version %i\n", GetProtocolVersion());
if (GetProtocolVersion() != 49)
{
LOG("... that's not a version we support.\n", 0);
return -1;
}
utf8str Username = GetUsername();
Username.push_back(0);
LOG(" Username: %s\n", &(Username[0]));
//m_Client = new CClient(Username16);
Connection->SetConnectionState(HANDSHAKE);
// let the client know...
Connection->SendToClient(CGenericS2CPacket::Serialize(S2CKICK, &MakeUTF8("Sorry, that doesn't work yet!")));
return 0;
}

View file

@ -20,6 +20,7 @@ namespace umcs {
char GetProtocolVersion(void) { return m_ProtocolVersion; }
const utf8str GetUsername(void) { return m_Username; }
virtual int Handle(CClientConnection *Connection);
};
};

View file

@ -1,6 +1,8 @@
#include "C2SFEServerListPing.h"
using namespace umcs;
#include "../ClientConnection.h"
bool C2SFEServerListPing::ReadField(unsigned int Field)
{
switch (Field)
@ -8,4 +10,55 @@ bool C2SFEServerListPing::ReadField(unsigned int Field)
case 0:
return ReadByte(m_Magic);
}
}
int C2SFEServerListPing::Handle(CClientConnection *Connection)
{
if (GetMagic() != 1)
{
LOG("Weird server list ping magic %i\n", GetMagic());
return -1;
}
// we have to use custom serialization code here,
// because the response contains an illegal unicode
// character;
utf8str Response;
// protocol
AppendUTF8(Response, "49");
Response.push_back(0);
// MC version
AppendUTF8(Response, "1.4.4");
Response.push_back(0);
// MOTD
AppendUTF8(Response, "A umcs server.");
Response.push_back(0);
// Player Count
AppendUTF8(Response, "0");
Response.push_back(0);
AppendUTF8(Response, "20");
Response.push_back(0);
TVector<unsigned char> Buffer;
Buffer.push_back(0xFF);
unsigned int Length = Response.size() + 3;
Buffer.push_back(Length >> 8);
Buffer.push_back(Length & 0xFF);
Buffer.push_back(0x00);
Buffer.push_back(0xA7);
Buffer.push_back(0x00);
Buffer.push_back(0x31);
Buffer.push_back(0x00);
Buffer.push_back(0x00);
for (auto It = Response.begin(); It != Response.end(); It++)
{
Buffer.push_back(0);
Buffer.push_back(*It);
}
Connection->SendToClient(Buffer);
return 0;
}

View file

@ -16,6 +16,7 @@ namespace umcs {
virtual int GetPacketID(void) { return 0xFE; }
char GetMagic(void) { return m_Magic; }
virtual int Handle(CClientConnection *Connection);
};
};

View file

@ -1,9 +1,11 @@
#ifndef __GENERIC_C2S_PACKET_H__
#define __GENERIC_C2S_PACKET_H__
#include <functional>
#include "../config.h"
namespace umcs {
class CClientConnection;
class CGenericC2SPacket {
private:
unsigned char *m_Buffer;
@ -27,6 +29,7 @@ namespace umcs {
void SetDataLength(unsigned int Length);
int Process(void);
virtual int GetPacketID(void) { return -1; }
virtual int Handle(CClientConnection *Connection) { return -1; };
};
};

View file

@ -2,6 +2,7 @@
#define __GENERIC_S2C_PACKET_H__
#include "../config.h"
#include "../ClientConnection.h"
namespace umcs {
enum ES2CPacket : unsigned char {