-
Notifications
You must be signed in to change notification settings - Fork 51
BaseClient
juhgiyo edited this page Nov 14, 2012
·
14 revisions
- Idea of the "Base Client" is communicating the packets with the server whatever the way you prefer.
// SomePacketInfo.h
...
typedef enum _receivePacketType{
RECEIVE_PACKET_TYPE_DIDSOMETHING=0,
RECEIVE_PACKET_TYPE_DIDSOMETHING2,
RECEIVE_PACKET_TYPE_DIDSOMETHING3,
RECEIVE_PACKET_TYPE_ENDOFPROCESS,
}ReceivePacketType;
typedef enum _sendPacketType{
SEND_PACKET_TYPE_DOSOMETHING=0,
SEND_PACKET_TYPE_DOSOMETHING2,
SEND_PACKET_TYPE_DOSOMETHING3,
}SendPacketType;
struct SendPacket{
SendPacketType packetType;
unsigned int magicNum;
};
struct ReceivePacket{
ReceivePacketType packetType;
};
// SomeClient.h
#include "epl.h"
#include "SomePacketInfo.h"
using namespace epl;
// SomeClient.h
class SomeClient:public BaseClient
{
public:
SomeClient();
SomeClient(const SomeClient& b);
virtual ~SomeClient();
SomeClient & operator=(const SomeClient&b)
{
return *this;
}
virtual void parsePacket(const Packet &packet );
};
// SomeClient.cpp
SomeClient::SomeClient():BaseClient()
{
}
SomeClient::SomeClient(const SomeClient& b):BaseClient(b)
{
}
SomeClient::~SomeClient()
{
}
void SomeClient::parsePacket(const Packet &packet )
{
Packet sendPacket;
PacketContainer<SendPacket> packetContainer;
PacketContainer<ReceivePacket> container=PacketContainer<ReceivePacket>(reinterpret_cast<const void*>(packet.GetPacket()),packet.GetPacketByteSize(),false);
switch(container.GetPacketPtr()->packetType)
{
case RECEIVE_PACKET_TYPE_DIDSOMETHING:
_tprintf(_T("%s"), (TCHAR*)container.GetArray());
packetContainer=PacketContainer<SendPacket>();
packetContainer.GetPacketPtr()->packetType=SEND_PACKET_TYPE_DOSOMETHING2;
packetContainer.GetPacketPtr()->magicNum = 2;
CString someString=_T("Hello back");
packetContainer.SetArray(reinterpret_cast<const char*>(someString.GetString()),(someString.GetLength()+1)*sizeof(TCHAR));
sendPacket=Packet(reinterpret_cast<const void*>(packetContainer.GetPacketPtr()),packetContainer.GetPacketByteSize(),false);
Send(sendPacket);
break;
case RECEIVE_PACKET_TYPE_DIDSOMETHING2:
_tprintf(_T("%s"), (TCHAR*)container.GetArray());
packetContainer=PacketContainer<SendPacket>();
packetContainer.GetPacketPtr()->packetType=SEND_PACKET_TYPE_DOSOMETHING3;
packetContainer.GetPacketPtr()->magicNum = 3;
CString someString=_T("Hello back");
packetContainer.SetArray(reinterpret_cast<const char*>(someString.GetString()),(someString.GetLength()+1)*sizeof(TCHAR));
sendPacket=Packet(reinterpret_cast<const void*>(packetContainer.GetPacketPtr()),packetContainer.GetPacketByteSize(),false);
Send(sendPacket);
break;
case RECEIVE_PACKET_TYPE_DIDSOMETHING3:
...
break;
case RECEIVE_PACKET_TYPE_ENDOFPROCESS:
// Transmission from the server is done
...
break;
default:
//TODO: Message Output for Error
break;
}
}
-
- Note that each "parsePacket" function runs in different thread.
#include "SomeClient.h"
SomeClient m_client;
...
m_client.SetHostName(_T("11.222.33.44"));
m_client.SetPort(_T("1020")); // Must be same as server side port setting, but this must be done before connecting to server
if(m_client.Connect())
{
// connected to server
PacketContainer<SendPacket> packetContainer=PacketContainer<SendPacket>();
packetContainer.GetPacketPtr()->packetType=SEND_PACKET_TYPE_DOSOMETHING;
Packet sendPacket=Packet(reinterpret_cast<const void*>(packetContainer.GetPacketPtr()),packetContainer.GetPacketByteSize(),false);
if(!m_client.Send(sendPacket))
{
// send failed
}
}
else
{
// connection failed
}
...
if(m_client.IsConnected()) // check if connected to server
{
m_client.Disconnect(); // Disconnect from the server
}