Refactored packet handling into packet methods.
This commit is contained in:
parent
c8aac8900e
commit
ab159a3887
9 changed files with 102 additions and 79 deletions
|
@ -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;
|
||||
}
|
|
@ -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);
|
||||
};
|
||||
};
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -20,6 +20,7 @@ namespace umcs {
|
|||
|
||||
char GetProtocolVersion(void) { return m_ProtocolVersion; }
|
||||
const utf8str GetUsername(void) { return m_Username; }
|
||||
virtual int Handle(CClientConnection *Connection);
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -16,6 +16,7 @@ namespace umcs {
|
|||
virtual int GetPacketID(void) { return 0xFE; }
|
||||
|
||||
char GetMagic(void) { return m_Magic; }
|
||||
virtual int Handle(CClientConnection *Connection);
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
@ -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; };
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
#define __GENERIC_S2C_PACKET_H__
|
||||
|
||||
#include "../config.h"
|
||||
#include "../ClientConnection.h"
|
||||
|
||||
namespace umcs {
|
||||
enum ES2CPacket : unsigned char {
|
||||
|
|
Reference in a new issue