Merge branch 'Network' of https://github.com/dean11/Danbias into Network
This commit is contained in:
commit
e81062b875
|
@ -118,8 +118,7 @@ namespace Oyster
|
|||
Type ThreadSafeQueue<Type>::Pop()
|
||||
{
|
||||
mutex.LockMutex();
|
||||
if(this->front != NULL)
|
||||
{
|
||||
|
||||
Type item = this->front->item;
|
||||
Node *destroyer = this->front;
|
||||
this->front = front->next;
|
||||
|
@ -132,48 +131,40 @@ namespace Oyster
|
|||
this->front = NULL;
|
||||
this->back = NULL;
|
||||
}
|
||||
|
||||
mutex.UnlockMutex();
|
||||
return item;
|
||||
}
|
||||
|
||||
mutex.UnlockMutex();
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
template < typename Type >
|
||||
Type ThreadSafeQueue<Type>::Front()
|
||||
{
|
||||
mutex.LockMutex();
|
||||
if(front != NULL)
|
||||
{
|
||||
mutex.UnlockMutex();
|
||||
|
||||
return this->front->item;
|
||||
}
|
||||
|
||||
mutex.UnlockMutex();
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
template < typename Type >
|
||||
Type ThreadSafeQueue<Type>::Back()
|
||||
{
|
||||
mutex.LockMutex();
|
||||
if(back != NULL)
|
||||
{
|
||||
|
||||
return this->back->item;
|
||||
}
|
||||
|
||||
mutex.UnlockMutex();
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
template < typename Type >
|
||||
int ThreadSafeQueue<Type>::Size()
|
||||
{
|
||||
//? behövs denna låsas?
|
||||
mutex.LockMutex();
|
||||
|
||||
return this->nrOfNodes;
|
||||
|
||||
mutex.UnlockMutex();
|
||||
}
|
||||
|
||||
|
@ -181,7 +172,7 @@ namespace Oyster
|
|||
bool ThreadSafeQueue<Type>::IsEmpty()
|
||||
{
|
||||
mutex.LockMutex();
|
||||
if(nrOfNodes == 0 && this->front == NULL)
|
||||
if(nrOfNodes == 0 || this->front == NULL)
|
||||
{
|
||||
mutex.UnlockMutex();
|
||||
return true;
|
||||
|
@ -191,6 +182,7 @@ namespace Oyster
|
|||
{
|
||||
mutex.UnlockMutex();
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -99,11 +99,11 @@ int Connection::Disconnect()
|
|||
return WSAGetLastError();
|
||||
}
|
||||
|
||||
int Connection::Send(OysterByte& bytes)
|
||||
int Connection::Send(Utility::DynamicMemory::SmartPointer<OysterByte> &bytes)
|
||||
{
|
||||
int nBytes;
|
||||
|
||||
nBytes = send(this->socket, bytes, bytes.GetSize(), 0);
|
||||
nBytes = send(this->socket, *bytes, bytes->GetSize(), 0);
|
||||
if(nBytes == SOCKET_ERROR)
|
||||
{
|
||||
return WSAGetLastError();
|
||||
|
@ -112,19 +112,20 @@ int Connection::Send(OysterByte& bytes)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int Connection::Recieve(OysterByte& bytes)
|
||||
int Connection::Recieve(Utility::DynamicMemory::SmartPointer<OysterByte> &bytes)
|
||||
{
|
||||
int nBytes;
|
||||
|
||||
bytes.Resize(1000);
|
||||
nBytes = recv(this->socket, bytes, 500, 0);
|
||||
bytes.Get()->Resize(1000);
|
||||
bytes->Resize(1000);
|
||||
nBytes = recv(this->socket, *bytes , 500, 0);
|
||||
if(nBytes == SOCKET_ERROR)
|
||||
{
|
||||
return WSAGetLastError();
|
||||
}
|
||||
else
|
||||
{
|
||||
bytes.SetSize(nBytes);
|
||||
bytes->SetSize(nBytes);
|
||||
}
|
||||
|
||||
std::cout << "Size of the recieved data: " << nBytes << " bytes" << std::endl;
|
||||
|
|
|
@ -23,8 +23,8 @@ namespace Oyster
|
|||
virtual int InitiateServer( unsigned short port );
|
||||
virtual int InitiateClient();
|
||||
|
||||
virtual int Send( OysterByte& bytes );
|
||||
virtual int Recieve( OysterByte& bytes );
|
||||
virtual int Send( Utility::DynamicMemory::SmartPointer<OysterByte> &bytes );
|
||||
virtual int Recieve( Utility::DynamicMemory::SmartPointer<OysterByte> &bytes );
|
||||
|
||||
virtual int Disconnect();
|
||||
virtual int Connect( unsigned short port , const char serverName[] );
|
||||
|
|
|
@ -5,6 +5,8 @@
|
|||
// Created by Sam Svensson 2013 //
|
||||
//////////////////////////////////
|
||||
|
||||
#include "../../Misc/Utilities.h"
|
||||
|
||||
namespace Oyster
|
||||
{
|
||||
namespace Network
|
||||
|
@ -17,8 +19,8 @@ namespace Oyster
|
|||
|
||||
//sends and recieve functions with bytearrays,
|
||||
//will send to the users connection via socket
|
||||
virtual int Send( OysterByte& bytes ) = 0;
|
||||
virtual int Recieve( OysterByte& bytes) = 0;
|
||||
virtual int Send( Utility::DynamicMemory::SmartPointer<OysterByte> &bytes ) = 0;
|
||||
virtual int Recieve( Utility::DynamicMemory::SmartPointer<OysterByte> &bytes) = 0;
|
||||
|
||||
//initiates sockets and address for server and client
|
||||
virtual int InitiateServer( unsigned short port ) { return false; };
|
||||
|
|
|
@ -5,6 +5,8 @@
|
|||
// Created by Sam Svensson 2013 //
|
||||
//////////////////////////////////
|
||||
|
||||
#include "../../Misc/Utilities.h"
|
||||
|
||||
namespace Oyster
|
||||
{
|
||||
namespace Network
|
||||
|
@ -15,8 +17,8 @@ namespace Oyster
|
|||
|
||||
public:
|
||||
//packs and unpacks packages for sending or recieving over the connection
|
||||
virtual void Pack (Protocols::ProtocolHeader &header, OysterByte& bytes) = 0;
|
||||
virtual void Unpack (Protocols::ProtocolSet* set, OysterByte& bytes ) = 0;
|
||||
virtual void Pack (Protocols::ProtocolHeader &header, Utility::DynamicMemory::SmartPointer<OysterByte> &bytes) = 0;
|
||||
virtual void Unpack (Protocols::ProtocolSet* set, Utility::DynamicMemory::SmartPointer<OysterByte> &bytes ) = 0;
|
||||
|
||||
};
|
||||
}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
#include "Listener.h"
|
||||
|
||||
using namespace Oyster::Network::Server;
|
||||
using namespace Utility::DynamicMemory;
|
||||
|
||||
Listener::Listener()
|
||||
{
|
||||
|
@ -31,7 +32,7 @@ void Listener::Shutdown()
|
|||
thread.Stop();
|
||||
}
|
||||
|
||||
void Listener::SetPostBox(Oyster::Network::IPostBox<int>* postBox)
|
||||
void Listener::SetPostBox(Oyster::Network::IPostBox<SmartPointer<int>>* postBox)
|
||||
{
|
||||
mutex.LockMutex();
|
||||
this->postBox = postBox;
|
||||
|
@ -40,8 +41,8 @@ void Listener::SetPostBox(Oyster::Network::IPostBox<int>* postBox)
|
|||
|
||||
int Listener::Accept()
|
||||
{
|
||||
int clientSocket = 0;
|
||||
clientSocket = connection->Listen();
|
||||
SmartPointer<int> clientSocket = SmartPointer<int>(new int());
|
||||
*clientSocket = connection->Listen();
|
||||
|
||||
mutex.LockMutex();
|
||||
postBox->PostMessage(clientSocket);
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
#include "../NetworkDependencies/Connection.h"
|
||||
#include "../../Misc/Thread/OysterThread.h"
|
||||
#include "../../Misc/Thread/OysterMutex.h"
|
||||
#include "../../Misc/Utilities.h"
|
||||
#include "IPostBox.h"
|
||||
|
||||
namespace Oyster
|
||||
|
@ -26,7 +27,7 @@ namespace Oyster
|
|||
bool Init(unsigned int port);
|
||||
void Shutdown();
|
||||
|
||||
void SetPostBox(IPostBox<int>* postBox);
|
||||
void SetPostBox(IPostBox<Utility::DynamicMemory::SmartPointer<int>>* postBox);
|
||||
|
||||
private:
|
||||
//Thread functions
|
||||
|
@ -43,7 +44,7 @@ namespace Oyster
|
|||
::Oyster::Thread::OysterThread thread;
|
||||
OysterMutex mutex;
|
||||
|
||||
IPostBox<int>* postBox;
|
||||
IPostBox<Utility::DynamicMemory::SmartPointer<int>>* postBox;
|
||||
|
||||
};
|
||||
}
|
||||
|
|
|
@ -53,8 +53,7 @@ namespace Oyster
|
|||
{
|
||||
if(IsFull())
|
||||
{
|
||||
message = messages.Front();
|
||||
messages.Pop();
|
||||
message = messages.Pop();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
|
|
@ -3,18 +3,19 @@
|
|||
#include <iostream>
|
||||
using namespace Oyster::Network;
|
||||
using namespace Oyster::Thread;
|
||||
using namespace Utility::DynamicMemory;
|
||||
|
||||
ThreadedClient::ThreadedClient()
|
||||
{
|
||||
this->connection = new Connection();
|
||||
this->sendPostBox = new PostBox<OysterByte*>();
|
||||
this->sendPostBox = new PostBox<SmartPointer<OysterByte>>();
|
||||
this->recvPostBox = NULL;
|
||||
}
|
||||
|
||||
ThreadedClient::ThreadedClient(unsigned int socket)
|
||||
{
|
||||
this->connection = new Connection(socket);
|
||||
this->sendPostBox = new PostBox<OysterByte*>();
|
||||
this->sendPostBox = new PostBox<SmartPointer<OysterByte>>();
|
||||
this->recvPostBox = NULL;
|
||||
|
||||
connection->SetBlockingMode(false);
|
||||
|
@ -22,10 +23,10 @@ ThreadedClient::ThreadedClient(unsigned int socket)
|
|||
thread.Create(this, true);
|
||||
}
|
||||
|
||||
ThreadedClient::ThreadedClient(IPostBox<OysterByte*>* postBox, unsigned int socket)
|
||||
ThreadedClient::ThreadedClient(IPostBox<SmartPointer<OysterByte>>* postBox, unsigned int socket)
|
||||
{
|
||||
this->connection = new Connection(socket);
|
||||
this->sendPostBox = new PostBox<OysterByte*>;
|
||||
this->sendPostBox = new PostBox<SmartPointer<OysterByte>>;
|
||||
this->recvPostBox = postBox;
|
||||
|
||||
connection->SetBlockingMode(false);
|
||||
|
@ -47,7 +48,7 @@ ThreadedClient::~ThreadedClient()
|
|||
}
|
||||
}
|
||||
|
||||
int ThreadedClient::Send(OysterByte* byte)
|
||||
int ThreadedClient::Send(SmartPointer<OysterByte> &byte)
|
||||
{
|
||||
mutex.LockMutex();
|
||||
this->sendPostBox->PostMessage(byte);
|
||||
|
@ -61,9 +62,9 @@ int ThreadedClient::Send()
|
|||
mutex.LockMutex();
|
||||
if(sendPostBox->IsFull())
|
||||
{
|
||||
OysterByte *temp = NULL;
|
||||
SmartPointer<OysterByte> temp = NULL;
|
||||
sendPostBox->FetchMessage(temp);
|
||||
errorCode = this->connection->Send(*temp);
|
||||
errorCode = this->connection->Send(temp);
|
||||
}
|
||||
mutex.UnlockMutex();
|
||||
|
||||
|
@ -74,8 +75,8 @@ int ThreadedClient::Recv()
|
|||
{
|
||||
int errorCode = 0;
|
||||
|
||||
OysterByte *temp = new OysterByte();
|
||||
errorCode = this->connection->Recieve(*temp);
|
||||
SmartPointer<OysterByte> temp = SmartPointer<OysterByte>(new OysterByte());
|
||||
errorCode = this->connection->Recieve(temp);
|
||||
|
||||
if(errorCode == 0)
|
||||
{
|
||||
|
@ -83,10 +84,6 @@ int ThreadedClient::Recv()
|
|||
recvPostBox->PostMessage(temp);
|
||||
mutex.UnlockMutex();
|
||||
}
|
||||
else
|
||||
{
|
||||
delete temp;
|
||||
}
|
||||
|
||||
return errorCode;
|
||||
}
|
||||
|
@ -137,7 +134,7 @@ int ThreadedClient::Connect(unsigned short port, const char serverName[])
|
|||
return 0;
|
||||
}
|
||||
|
||||
void ThreadedClient::setRecvPostBox(IPostBox<OysterByte*>* postBox)
|
||||
void ThreadedClient::setRecvPostBox(IPostBox<SmartPointer<OysterByte>> *postBox)
|
||||
{
|
||||
this->mutex.LockMutex();
|
||||
this->recvPostBox = postBox;
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
#include "../NetworkDependencies/PostBox.h"
|
||||
#include "../../Misc/Thread/OysterThread.h"
|
||||
#include "../../Misc/Thread/OysterMutex.h"
|
||||
#include "../../Misc/Utilities.h"
|
||||
|
||||
namespace Oyster
|
||||
{
|
||||
|
@ -20,14 +21,14 @@ namespace Oyster
|
|||
public:
|
||||
ThreadedClient();
|
||||
ThreadedClient(unsigned int socket);
|
||||
ThreadedClient(IPostBox<OysterByte*>* postBox, unsigned int socket);
|
||||
ThreadedClient(IPostBox<Utility::DynamicMemory::SmartPointer< OysterByte >> *postBox, unsigned int socket);
|
||||
virtual ~ThreadedClient();
|
||||
|
||||
int Send(OysterByte* byte);
|
||||
int Send(Utility::DynamicMemory::SmartPointer< OysterByte > &byte);
|
||||
|
||||
int Connect(unsigned short port, const char serverName[]);
|
||||
|
||||
void setRecvPostBox(IPostBox<OysterByte*>* postBox);
|
||||
void setRecvPostBox(IPostBox< Utility::DynamicMemory::SmartPointer< OysterByte >> *postBox);
|
||||
|
||||
private:
|
||||
virtual int Send();
|
||||
|
@ -39,8 +40,8 @@ namespace Oyster
|
|||
|
||||
private:
|
||||
Connection* connection;
|
||||
IPostBox<OysterByte*>* sendPostBox;
|
||||
IPostBox<OysterByte*>* recvPostBox;
|
||||
IPostBox<Utility::DynamicMemory::SmartPointer<OysterByte>> *sendPostBox;
|
||||
IPostBox<Utility::DynamicMemory::SmartPointer<OysterByte>> *recvPostBox;
|
||||
Oyster::Thread::OysterThread thread;
|
||||
OysterMutex mutex;
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@ using namespace Oyster::Network;
|
|||
using namespace ::Protocols;
|
||||
using namespace ::Messages;
|
||||
|
||||
void Translator::Pack( ProtocolHeader &header, OysterByte& bytes )
|
||||
void Translator::Pack( ProtocolHeader &header, Utility::DynamicMemory::SmartPointer<OysterByte> &bytes )
|
||||
{
|
||||
MessageHeader *message = NULL;
|
||||
|
||||
|
@ -25,19 +25,19 @@ void Translator::Pack( ProtocolHeader &header, OysterByte& bytes )
|
|||
|
||||
if(message != NULL)
|
||||
{
|
||||
message->Pack(header, bytes);
|
||||
message->Pack(header, *bytes);
|
||||
|
||||
delete message;
|
||||
message = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void Translator::Unpack(ProtocolSet* set, OysterByte& bytes )
|
||||
void Translator::Unpack(ProtocolSet* set, Utility::DynamicMemory::SmartPointer<OysterByte> &bytes)
|
||||
{
|
||||
ProtocolHeader *header = new ProtocolHeader();
|
||||
MessageHeader *message = new MessageHeader();
|
||||
|
||||
message->Unpack(bytes, *header);
|
||||
message->Unpack(*bytes, *header);
|
||||
delete message;
|
||||
message = NULL;
|
||||
|
||||
|
@ -48,19 +48,19 @@ void Translator::Unpack(ProtocolSet* set, OysterByte& bytes )
|
|||
case PackageType_header:
|
||||
message = new MessageHeader();
|
||||
set->Protocol.pHeader = new ProtocolHeader;
|
||||
message->Unpack(bytes, *set->Protocol.pHeader);
|
||||
message->Unpack(*bytes, *set->Protocol.pHeader);
|
||||
break;
|
||||
|
||||
case PackageType_test:
|
||||
message = new MessageTest();
|
||||
set->Protocol.pTest = new ProtocolTest;
|
||||
message->Unpack(bytes, *set->Protocol.pTest);
|
||||
message->Unpack(*bytes, *set->Protocol.pTest);
|
||||
break;
|
||||
|
||||
case PackageType_player_pos:
|
||||
message = new MessagePlayerPos();
|
||||
set->Protocol.pPlayerPos = new ProtocolPlayerPos;
|
||||
message->Unpack(bytes, *set->Protocol.pPlayerPos);
|
||||
message->Unpack(*bytes, *set->Protocol.pPlayerPos);
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
@ -20,8 +20,8 @@ namespace Oyster
|
|||
Translator () { };
|
||||
~Translator() { };
|
||||
|
||||
void Pack (Protocols::ProtocolHeader &header, OysterByte& bytes );
|
||||
void Unpack (Protocols::ProtocolSet* set, OysterByte& bytes );
|
||||
void Pack (Protocols::ProtocolHeader &header, Utility::DynamicMemory::SmartPointer<OysterByte> &bytes );
|
||||
void Unpack (Protocols::ProtocolSet* set, Utility::DynamicMemory::SmartPointer<OysterByte> &bytes );
|
||||
|
||||
private:
|
||||
|
||||
|
|
|
@ -16,6 +16,7 @@ using namespace std;
|
|||
using namespace Oyster::Network::Protocols;
|
||||
using namespace Oyster::Network;
|
||||
using namespace Utility;
|
||||
using namespace Utility::DynamicMemory;
|
||||
|
||||
void chat(ThreadedClient &client);
|
||||
void PrintOutMessage(ProtocolSet* set);
|
||||
|
@ -54,12 +55,12 @@ int main()
|
|||
void chat(ThreadedClient &client)
|
||||
{
|
||||
Oyster::Network::Translator *t = new Oyster::Network::Translator();
|
||||
IPostBox<OysterByte*>* postBox = new PostBox<OysterByte*>;
|
||||
IPostBox< SmartPointer<OysterByte >> *postBox = new PostBox< SmartPointer<OysterByte >>;
|
||||
|
||||
client.setRecvPostBox(postBox);
|
||||
|
||||
Oyster::Network::OysterByte* msgRecv = NULL;
|
||||
Oyster::Network::OysterByte* msgSend = new OysterByte();
|
||||
SmartPointer<OysterByte> msgRecv = NULL;
|
||||
SmartPointer<OysterByte> msgSend = SmartPointer<OysterByte>(new OysterByte());
|
||||
|
||||
ProtocolSet* set = new ProtocolSet;
|
||||
ProtocolPlayerPos test;
|
||||
|
@ -72,7 +73,7 @@ void chat(ThreadedClient &client)
|
|||
test.matrix[i] = temp;
|
||||
temp++;
|
||||
}
|
||||
t->Pack(test, *msgSend);
|
||||
t->Pack(test, msgSend);
|
||||
|
||||
WinTimer timer;
|
||||
|
||||
|
@ -81,7 +82,7 @@ void chat(ThreadedClient &client)
|
|||
//Fetch new messages from the postbox
|
||||
if(postBox->FetchMessage(msgRecv))
|
||||
{
|
||||
t->Unpack(set, *msgRecv);
|
||||
t->Unpack(set, msgRecv);
|
||||
delete msgRecv;
|
||||
|
||||
PrintOutMessage(set);
|
||||
|
@ -97,7 +98,6 @@ void chat(ThreadedClient &client)
|
|||
}
|
||||
}
|
||||
|
||||
delete msgSend;
|
||||
delete postBox;
|
||||
delete t;
|
||||
delete set;
|
||||
|
|
|
@ -9,6 +9,8 @@
|
|||
#include "../NetworkDependencies/OysterByte.h"
|
||||
#include "../NetworkDependencies/PostBox.h"
|
||||
#include "../../Misc/WinTimer.h"
|
||||
#include "../../Misc/Utilities.h"
|
||||
#include "../../Misc/Utilities-Impl.h"
|
||||
|
||||
#pragma comment(lib, "ws2_32.lib")
|
||||
|
||||
|
@ -17,20 +19,21 @@ using namespace Oyster::Network::Server;
|
|||
using namespace Oyster::Network;
|
||||
using namespace ::Protocols;
|
||||
using namespace Utility;
|
||||
using namespace ::Utility::DynamicMemory;
|
||||
|
||||
void PrintOutMessage(ProtocolSet* set);
|
||||
|
||||
int main()
|
||||
{
|
||||
OysterByte sendBuffer;
|
||||
OysterByte* recvBuffer = NULL;
|
||||
SmartPointer<OysterByte> sendBuffer = SmartPointer<OysterByte>(new OysterByte);
|
||||
SmartPointer<OysterByte> recvBuffer = NULL;
|
||||
ProtocolSet* set = new ProtocolSet;
|
||||
IPostBox<int>* postBox = new PostBox<int>();
|
||||
IPostBox<OysterByte*>* recvPostBox = new PostBox<OysterByte*>();
|
||||
IPostBox<SmartPointer<int>> *postBox = new PostBox<SmartPointer<int>>();
|
||||
IPostBox<SmartPointer<OysterByte>> *recvPostBox = new PostBox<SmartPointer<OysterByte>>();
|
||||
|
||||
cout << "Server" << endl;
|
||||
Translator t;
|
||||
int errorCode;
|
||||
int errorCode = 0;
|
||||
|
||||
if(!InitWinSock())
|
||||
{
|
||||
|
@ -61,16 +64,16 @@ int main()
|
|||
WinTimer timer;
|
||||
|
||||
vector<ThreadedClient*> clients;
|
||||
int client = -1;
|
||||
SmartPointer<int> client = SmartPointer<int>();
|
||||
while(1)
|
||||
{
|
||||
//Fetch new clients from the postbox
|
||||
if(postBox->FetchMessage(client))
|
||||
{
|
||||
cout << "Client connected: " << client << endl;
|
||||
clients.push_back(new ThreadedClient(recvPostBox, client));
|
||||
cout << "Client connected: " << *client << endl;
|
||||
clients.push_back(new ThreadedClient(recvPostBox, *client));
|
||||
|
||||
clients.at(clients.size()-1)->Send(&sendBuffer);
|
||||
clients.at(clients.size()-1)->Send(sendBuffer);
|
||||
}
|
||||
|
||||
//Send a message every 1 secounds to all clients.
|
||||
|
@ -80,14 +83,14 @@ int main()
|
|||
timer.reset();
|
||||
for(int i = 0; i < (int)clients.size(); i++)
|
||||
{
|
||||
clients.at(i)->Send(&sendBuffer);
|
||||
clients.at(i)->Send(sendBuffer);
|
||||
}
|
||||
}
|
||||
|
||||
//Fetch messages
|
||||
if(recvPostBox->FetchMessage(recvBuffer))
|
||||
{
|
||||
t.Unpack(set, *recvBuffer);
|
||||
t.Unpack(set, recvBuffer);
|
||||
delete recvBuffer;
|
||||
|
||||
PrintOutMessage(set);
|
||||
|
|
Loading…
Reference in New Issue