NetworkMessage->GetData fixed
Plugin -> Splitted message types
PluginManager is now thread safe
TcpConnection added list of events
Properly handling disconnection now
Fixed bug in Socket with error translation
It crashes when it exits, i think it has something to do with shared ptrs or something
This commit is contained in:
TheDoctor
2019-10-21 00:27:21 +01:00
parent 3555534628
commit 5f13265c5d
15 changed files with 223 additions and 107 deletions

View File

@ -89,7 +89,9 @@ namespace std::net
template<typename T>
T *GetData() const
{
return (T*)m_data;
if (m_data)
return (T*)m_data;
else return nullptr;
}
};
}

View File

@ -1,6 +1,8 @@
#pragma once
#include <VoidNet_HL/NetworkMessage.hpp>
#include <VoidNet_HL/InternalTags.hpp>
#include <string>
namespace std::net
{
@ -11,6 +13,29 @@ namespace std::net
{
}
virtual void HandleMessage(const NetworkMessage& msg) = 0;
void HandleMessage(const NetworkMessage& msg)
{
if (msg.GetTag() == (uint32_t)InternalTags::Disconnect)
{
OnDisconnect(*(msg.GetData<string>()));
}
else if (msg.GetTag() == (uint32_t)InternalTags::Connect)
{
OnNewConnection(msg.GetSenderID(), msg.GetData<void>());
}
else if (msg.GetTag() == (uint32_t)InternalTags::AssignID)
{
OnConnection();
}
else
{
OnDataReceived(msg.GetSenderID(), msg.GetDistributionMode(), msg.GetDestinationID(), msg.GetTag(), msg.GetData<void>());
}
}
virtual void OnDisconnect(string) abstract;
virtual void OnNewConnection(uint32_t, void*) abstract;
virtual void OnConnection() abstract;
virtual void OnDataReceived(uint32_t, DistributionMode, uint32_t, uint32_t, void*) abstract;
};
}

View File

@ -1,6 +1,7 @@
#pragma once
#include <vector>
#include <mutex>
#include "VoidNet_HL/Plugin/Plugin.hpp"
@ -14,16 +15,24 @@ namespace std::net
void HandleMessage(const NetworkMessage& msg)
{
m_pluginsMutex.lock();
for (size_t i = 0; i < m_plugins.size(); i++)
m_plugins.at(i)->HandleMessage(msg);
m_pluginsMutex.unlock();
}
void AddPlugin(Plugin* p)
{
m_pluginsMutex.lock();
m_plugins.emplace_back(p);
m_pluginsMutex.unlock();
}
private:
vector<Plugin*> m_plugins;
mutex m_pluginsMutex;
};
}

View File

@ -21,30 +21,55 @@ namespace std::net
bool Connect(IPAddress addr);
bool Disconnect();
template<typename T>
void SendMessage(DistributionMode mode, uint32_t destinationId, uint32_t tag, void *data)
bool SendMessage(DistributionMode mode, uint32_t destinationId, uint32_t tag, void *data)
{
NetworkMessage msg(m_id, mode, destinationId, tag, data, sizeof(T));
sendMessage(msg);
return sendMessage(msg);
}
void SendMessage(DistributionMode mode, uint32_t destinationId, uint32_t tag)
bool SendMessage(DistributionMode mode, uint32_t destinationId, uint32_t tag)
{
NetworkMessage msg(m_id, mode, destinationId, tag, nullptr, 0);
sendMessage(msg);
return sendMessage(msg);
}
void ReceiveData();
function<void(uint32_t, DistributionMode, uint32_t, uint32_t, void*)> DataReceivedEvent;
function<void(string)> DisconnectedEvent;
function<void(uint32_t, void*)> NewConnectionEvent;
function<void()> OnConnectionEvent;
bool IsConnected;
private:
bool sendMessage(const NetworkMessage &msg);
shared_ptr<TcpClient> m_client;
uint32_t m_id;
vector<function<void(uint32_t, DistributionMode, uint32_t, uint32_t, void*)>> m_onDataReceived;
vector<function<void(string)>> m_onDisconnect;
vector<function<void(uint32_t, void*)>> m_onNewConnection;
vector<function<void()>> m_onConnection;
public:
void operator+=(const function<void(uint32_t, DistributionMode, uint32_t, uint32_t, void*)> &rhs)
{
m_onDataReceived.push_back(rhs);
}
void operator+=(const function<void(string)>& rhs)
{
m_onDisconnect.push_back(rhs);
}
void operator+=(const function<void(uint32_t, void*)> & rhs)
{
m_onNewConnection.push_back(rhs);
}
void operator+=(const function<void()>& rhs)
{
m_onConnection.push_back(rhs);
}
};
}

View File

@ -47,7 +47,6 @@ namespace std::net
uint32_t m_maxConnections = 0;
thread m_receiveThread;
thread m_sendThread;
atomic_bool m_run;

View File

@ -3,6 +3,7 @@
#pragma once
#include <map>
#include <string>
namespace std::net
{

View File

@ -81,8 +81,8 @@ namespace std::net
enum class SocketType
{
Unknown = -1,
Datagram = 2,
Streaming = 1,
Datagram = 2, //SOCK_DGRAM
Streaming = 1, //SOCK_STREAM
};
enum class SocketProtocol

View File

@ -3,6 +3,7 @@
#pragma once
#include <map>
#include <string>
namespace std::net
{

View File

@ -21,7 +21,7 @@ namespace std::net
init();
}
virtual ~Socket() { Close(); }
virtual ~Socket() { }
public: