Network buffer should now dynamically increase when needed.

This commit is contained in:
Jocke
2016-02-22 16:01:26 +01:00
parent bac23f6e8c
commit ed9149fe63
13 changed files with 206 additions and 45 deletions
+4 -1
View File
@@ -9,13 +9,16 @@ typedef unsigned int PacketID;
class NetworkClient class NetworkClient
{ {
public: public:
NetworkClient();
virtual ~NetworkClient();
virtual void Connect(std::string playerName, std::string address, int port) = 0; virtual void Connect(std::string playerName, std::string address, int port) = 0;
virtual void Disconnect() = 0; virtual void Disconnect() = 0;
virtual void Receive(Packet& packet) = 0; virtual void Receive(Packet& packet) = 0;
virtual void Send(Packet & packet) = 0; virtual void Send(Packet & packet) = 0;
virtual bool IsSocketAvailable() = 0; virtual bool IsSocketAvailable() = 0;
protected: protected:
char m_ReadBuffer[BUFFERSIZE] = { 0 }; char* m_ReadBuffer;
unsigned int m_BufferSize = BUFFERSIZE;
}; };
#endif #endif
+9
View File
@@ -0,0 +1,9 @@
#include "NetworkServer.h"
NetworkServer::NetworkServer()
{
m_ReadBuffer = new char[m_BufferSize];
}
NetworkServer::~NetworkServer()
{ }
+4 -1
View File
@@ -10,12 +10,15 @@ typedef unsigned int PacketID;
class NetworkServer class NetworkServer
{ {
public: public:
NetworkServer();
virtual ~NetworkServer();
virtual void AcceptNewConnections(int& nextPlayerID, std::map<PlayerID, PlayerDefinition>& connectedPlayers) = 0; virtual void AcceptNewConnections(int& nextPlayerID, std::map<PlayerID, PlayerDefinition>& connectedPlayers) = 0;
virtual void Receive(Packet & packet, PlayerDefinition & playerDefinition) = 0; virtual void Receive(Packet & packet, PlayerDefinition & playerDefinition) = 0;
virtual void Send(Packet & packet, PlayerDefinition & playerDefinition) = 0; virtual void Send(Packet & packet, PlayerDefinition & playerDefinition) = 0;
virtual void Send(Packet & packet) = 0; virtual void Send(Packet & packet) = 0;
protected: protected:
char m_ReadBuffer[BUFFERSIZE] = { 0 }; char* m_ReadBuffer;
unsigned int m_BufferSize = BUFFERSIZE;
}; };
#endif #endif
+1 -1
View File
@@ -20,7 +20,7 @@ private:
boost::asio::ip::tcp::endpoint m_Endpoint; boost::asio::ip::tcp::endpoint m_Endpoint;
boost::asio::io_service m_IOService; boost::asio::io_service m_IOService;
std::unique_ptr<boost::asio::ip::tcp::socket> m_Socket; std::unique_ptr<boost::asio::ip::tcp::socket> m_Socket;
size_t readBuffer(char* data); size_t readBuffer();
PacketID m_SendPacketID = 0; PacketID m_SendPacketID = 0;
bool m_IsConnected = false; bool m_IsConnected = false;
}; };
+1 -1
View File
@@ -25,7 +25,7 @@ private:
void handle_accept(boost::shared_ptr<boost::asio::ip::tcp::socket> socket, void handle_accept(boost::shared_ptr<boost::asio::ip::tcp::socket> socket,
int& nextPlayerID, std::map<PlayerID, PlayerDefinition>& connectedPlayers, int& nextPlayerID, std::map<PlayerID, PlayerDefinition>& connectedPlayers,
const boost::system::error_code& error); const boost::system::error_code& error);
int readBuffer(char* data, PlayerDefinition& playerDefinition); int readBuffer(PlayerDefinition& playerDefinition);
}; };
#endif #endif
+1 -1
View File
@@ -20,7 +20,7 @@ private:
boost::asio::io_service m_IOService; boost::asio::io_service m_IOService;
boost::asio::ip::udp::endpoint m_ReceiverEndpoint; boost::asio::ip::udp::endpoint m_ReceiverEndpoint;
boost::shared_ptr<boost::asio::ip::udp::socket> m_Socket; boost::shared_ptr<boost::asio::ip::udp::socket> m_Socket;
int readBuffer(char* data); int readBuffer();
PacketID m_SendPacketID = 0; PacketID m_SendPacketID = 0;
}; };
+1 -1
View File
@@ -19,7 +19,7 @@ private:
boost::asio::io_service m_IOService; boost::asio::io_service m_IOService;
boost::asio::ip::udp::endpoint m_ReceiverEndpoint; boost::asio::ip::udp::endpoint m_ReceiverEndpoint;
std::unique_ptr<boost::asio::ip::udp::socket> m_Socket; std::unique_ptr<boost::asio::ip::udp::socket> m_Socket;
int readBuffer(char* data); int readBuffer();
}; };
#endif #endif
+9
View File
@@ -0,0 +1,9 @@
#include "..\..\..\include\Engine\Network\NetworkClient.h"
NetworkClient::NetworkClient()
{
m_ReadBuffer = new char[m_BufferSize];
}
NetworkClient::~NetworkClient()
{ }
+3 -1
View File
@@ -446,7 +446,9 @@ void Server::parsePing()
{ {
for (auto& kv : m_ConnectedPlayers) { for (auto& kv : m_ConnectedPlayers) {
if (kv.second.TCPAddress == m_Address && if (kv.second.TCPAddress == m_Address &&
kv.second.TCPPort == m_Port) { kv.second.TCPPort == m_Port
|| (kv.second.Endpoint.address() == m_Address
&& kv.second.Endpoint.port() == m_Port)) {
kv.second.StopTime = std::clock(); kv.second.StopTime = std::clock();
break; break;
} }
+38 -9
View File
@@ -56,32 +56,61 @@ void TCPClient::Disconnect()
void TCPClient::Receive(Packet& packet) void TCPClient::Receive(Packet& packet)
{ {
size_t bytesRead = readBuffer(m_ReadBuffer); size_t bytesRead = readBuffer();
if (bytesRead > 0) { if (bytesRead > 0) {
packet.ReconstructFromData(m_ReadBuffer, bytesRead); packet.ReconstructFromData(m_ReadBuffer, bytesRead);
} }
} }
size_t TCPClient::readBuffer(char* data) size_t TCPClient::readBuffer()
{ {
//if (!m_Socket) {
// return 0;
//}
//boost::system::error_code error;
//// Read size of packet
//size_t bytesReceived = m_Socket->read_some(boost
// ::asio::buffer((void*)data, sizeof(int)),
// error);
//int sizeOfPacket = 0;
//memcpy(&sizeOfPacket, data, sizeof(int));
//// Read the rest of the message
//bytesReceived += m_Socket->read_some(boost
// ::asio::buffer((void*)(data + bytesReceived), sizeOfPacket - bytesReceived),
// error);
//if (error) {
// //LOG_ERROR("receive: %s", error.message().c_str());
//}
//return bytesReceived;
if (!m_Socket) { if (!m_Socket) {
return 0; return 0;
} }
boost::system::error_code error; boost::system::error_code error;
// Read size of packet // Read size of packet
size_t bytesReceived = m_Socket->read_some(boost m_Socket->receive(boost
::asio::buffer((void*)data, sizeof(int)), ::asio::buffer((void*)m_ReadBuffer, sizeof(int)),
error); boost::asio::ip::tcp::socket::message_peek, error);
int sizeOfPacket = 0; unsigned int sizeOfPacket = 0;
memcpy(&sizeOfPacket, data, sizeof(int)); memcpy(&sizeOfPacket, m_ReadBuffer, sizeof(int));
// if the buffer is to small increase the size of it
if (sizeOfPacket > m_BufferSize) {
delete[] m_ReadBuffer;
m_ReadBuffer = new char[sizeOfPacket];
m_BufferSize = sizeOfPacket;
}
// Read the rest of the message // Read the rest of the message
bytesReceived += m_Socket->read_some(boost size_t bytesReceived = m_Socket->read_some(boost
::asio::buffer((void*)(data + bytesReceived), sizeOfPacket - bytesReceived), ::asio::buffer((void*)(m_ReadBuffer), sizeOfPacket),
error); error);
if (error) { if (error) {
//LOG_ERROR("receive: %s", error.message().c_str()); //LOG_ERROR("receive: %s", error.message().c_str());
} }
if (sizeOfPacket > 1000000)
LOG_WARNING("The packets received are bigger than 1MB");
return bytesReceived; return bytesReceived;
} }
+55 -13
View File
@@ -7,8 +7,7 @@ TCPServer::TCPServer()
} }
TCPServer::~TCPServer() TCPServer::~TCPServer()
{ { }
}
void TCPServer::AcceptNewConnections(int& nextPlayerID, std::map<PlayerID, PlayerDefinition>& connectedPlayers) void TCPServer::AcceptNewConnections(int& nextPlayerID, std::map<PlayerID, PlayerDefinition>& connectedPlayers)
{ {
@@ -31,7 +30,7 @@ PlayerID GetPlayerIDFromEndpoint(const std::map<PlayerID, PlayerDefinition>& con
return -1; return -1;
} }
void TCPServer::handle_accept(boost::shared_ptr<tcp::socket> socket, void TCPServer::handle_accept(boost::shared_ptr<tcp::socket> socket,
int& nextPlayerID, std::map<PlayerID, PlayerDefinition>& connectedPlayers, int& nextPlayerID, std::map<PlayerID, PlayerDefinition>& connectedPlayers,
const boost::system::error_code& error) const boost::system::error_code& error)
{ {
@@ -51,6 +50,8 @@ void TCPServer::handle_accept(boost::shared_ptr<tcp::socket> socket,
void TCPServer::Send(Packet & packet, PlayerDefinition & playerDefinition) void TCPServer::Send(Packet & packet, PlayerDefinition & playerDefinition)
{ {
if (!playerDefinition.TCPSocket)
return;
try { try {
packet.UpdateSize(); packet.UpdateSize();
int bytesSent = playerDefinition.TCPSocket->send( int bytesSent = playerDefinition.TCPSocket->send(
@@ -73,38 +74,79 @@ void TCPServer::Send(Packet & packet)
} }
void TCPServer::Disconnect() void TCPServer::Disconnect()
{ {
} }
//void TCPServer::Receive(Packet & packet, PlayerDefinition & playerDefinition)
//{
// int bytesRead = readBuffer(m_ReadBuffer, playerDefinition);
// if (bytesRead > 0) {
// packet.ReconstructFromData(m_ReadBuffer, bytesRead);
// }
// lastReceivedSocket = playerDefinition.TCPSocket;
//}
//
//int TCPServer::readBuffer(char* data, PlayerDefinition & playerDefinition)
//{
// if (!playerDefinition.TCPSocket) {
// return 0;
// }
// boost::system::error_code error;
// // Read size of packet
// size_t bytesReceived = playerDefinition.TCPSocket->read_some(boost
// ::asio::buffer((void*)data, sizeof(int)),
// error);
// int sizeOfPacket = 0;
// memcpy(&sizeOfPacket, data, sizeof(int));
//
// // Read the rest of the message
// bytesReceived += playerDefinition.TCPSocket->read_some(boost
// ::asio::buffer((void*)(data + bytesReceived), sizeOfPacket - bytesReceived),
// error);
// if (error) {
// //LOG_ERROR("receive: %s", error.message().c_str());
// }
// return bytesReceived;
//}
void TCPServer::Receive(Packet & packet, PlayerDefinition & playerDefinition) void TCPServer::Receive(Packet & packet, PlayerDefinition & playerDefinition)
{ {
int bytesRead = readBuffer(m_ReadBuffer, playerDefinition); int bytesRead = readBuffer(playerDefinition);
if (bytesRead > 0) { if (bytesRead > 0) {
packet.ReconstructFromData(m_ReadBuffer, bytesRead); packet.ReconstructFromData(m_ReadBuffer, bytesRead);
} }
lastReceivedSocket = playerDefinition.TCPSocket; lastReceivedSocket = playerDefinition.TCPSocket;
} }
int TCPServer::readBuffer(char* data, PlayerDefinition & playerDefinition) int TCPServer::readBuffer(PlayerDefinition & playerDefinition)
{ {
if (!playerDefinition.TCPSocket) { if (!playerDefinition.TCPSocket) {
return 0; return 0;
} }
boost::system::error_code error; boost::system::error_code error;
// Read size of packet // Read size of packet
size_t bytesReceived = playerDefinition.TCPSocket->read_some(boost playerDefinition.TCPSocket->receive(boost
::asio::buffer((void*)data, sizeof(int)), ::asio::buffer((void*)m_ReadBuffer, sizeof(int)),
error); boost::asio::ip::tcp::socket::message_peek, error);
int sizeOfPacket = 0; unsigned int sizeOfPacket = 0;
memcpy(&sizeOfPacket, data, sizeof(int)); memcpy(&sizeOfPacket, m_ReadBuffer, sizeof(int));
// if the buffer is to small increase the size of it
if (sizeOfPacket > m_BufferSize) {
delete[] m_ReadBuffer;
m_ReadBuffer = new char[sizeOfPacket];
m_BufferSize = sizeOfPacket;
}
// Read the rest of the message // Read the rest of the message
bytesReceived += playerDefinition.TCPSocket->read_some(boost size_t bytesReceived = playerDefinition.TCPSocket->read_some(boost
::asio::buffer((void*)(data + bytesReceived), sizeOfPacket - bytesReceived), ::asio::buffer((void*)(m_ReadBuffer), sizeOfPacket),
error); error);
if (error) { if (error) {
//LOG_ERROR("receive: %s", error.message().c_str()); //LOG_ERROR("receive: %s", error.message().c_str());
} }
if (sizeOfPacket > 1000000)
LOG_WARNING("The packets received are bigger than 1MB");
return bytesReceived; return bytesReceived;
} }
+38 -6
View File
@@ -27,30 +27,62 @@ void UDPClient::Disconnect()
void UDPClient::Receive(Packet& packet) void UDPClient::Receive(Packet& packet)
{ {
int bytesRead = readBuffer(m_ReadBuffer); int bytesRead = readBuffer();
if (bytesRead > 0) { if (bytesRead > 0) {
packet.ReconstructFromData(m_ReadBuffer, bytesRead); packet.ReconstructFromData(m_ReadBuffer, bytesRead);
} }
} }
int UDPClient::readBuffer(char* data) int UDPClient::readBuffer()
{ {
//if (!m_Socket) {
// return 0;
//}
//boost::system::error_code error;
//int bytesReceived = m_Socket->receive_from(boost
// ::asio::buffer((void*)data, BUFFERSIZE),
// m_ReceiverEndpoint,
// 0, error);
//if (error) {
// //LOG_ERROR("receive: %s", error.message().c_str());
//}
//return bytesReceived;
if (!m_Socket) { if (!m_Socket) {
return 0; return 0;
} }
boost::system::error_code error; boost::system::error_code error;
int bytesReceived = m_Socket->receive_from(boost // Read size of packet
::asio::buffer((void*)data, BUFFERSIZE), m_Socket->receive(boost
m_ReceiverEndpoint, ::asio::buffer((void*)m_ReadBuffer, sizeof(int)),
0, error); boost::asio::ip::udp::socket::message_peek, error);
int sizeOfPacket = 0;
memcpy(&sizeOfPacket, m_ReadBuffer, sizeof(int));
// if the buffer is to small increase the size of it
if (sizeOfPacket > m_BufferSize) {
delete[] m_ReadBuffer;
m_ReadBuffer = new char[sizeOfPacket];
m_BufferSize = sizeOfPacket;
}
size_t availableData = m_Socket->available();
// Read the rest of the message
size_t bytesReceived = m_Socket->receive_from(boost
::asio::buffer((void*)(m_ReadBuffer),
sizeOfPacket),
m_ReceiverEndpoint, 0, error);
if (error) { if (error) {
//LOG_ERROR("receive: %s", error.message().c_str()); //LOG_ERROR("receive: %s", error.message().c_str());
} }
if (sizeOfPacket > 1000000)
LOG_WARNING("The packets received are bigger than 1MB");
return bytesReceived; return bytesReceived;
} }
void UDPClient::Send(Packet& packet) void UDPClient::Send(Packet& packet)
{ {
packet.UpdateSize();
m_Socket->send_to(boost::asio::buffer( m_Socket->send_to(boost::asio::buffer(
packet.Data(), packet.Data(),
packet.Size()), packet.Size()),
+42 -10
View File
@@ -10,6 +10,7 @@ UDPServer::~UDPServer()
void UDPServer::Send(Packet& packet, PlayerDefinition & playerDefinition) void UDPServer::Send(Packet& packet, PlayerDefinition & playerDefinition)
{ {
packet.UpdateSize();
try { try {
int bytesSent = m_Socket->send_to( int bytesSent = m_Socket->send_to(
boost::asio::buffer(packet.Data(), packet.Size()), boost::asio::buffer(packet.Data(), packet.Size()),
@@ -23,6 +24,7 @@ void UDPServer::Send(Packet& packet, PlayerDefinition & playerDefinition)
// Send back to endpoint of received packet // Send back to endpoint of received packet
void UDPServer::Send(Packet & packet) void UDPServer::Send(Packet & packet)
{ {
packet.UpdateSize();
m_Socket->send_to( m_Socket->send_to(
boost::asio::buffer( boost::asio::buffer(
packet.Data(), packet.Data(),
@@ -33,7 +35,7 @@ void UDPServer::Send(Packet & packet)
void UDPServer::Receive(Packet & packet, PlayerDefinition & playerDefinition) void UDPServer::Receive(Packet & packet, PlayerDefinition & playerDefinition)
{ {
int bytesRead = readBuffer(m_ReadBuffer); int bytesRead = readBuffer();
if (bytesRead > 0) { if (bytesRead > 0) {
packet.ReconstructFromData(m_ReadBuffer, bytesRead); packet.ReconstructFromData(m_ReadBuffer, bytesRead);
} }
@@ -45,17 +47,47 @@ bool UDPServer::IsSocketAvailable()
return m_Socket->available(); return m_Socket->available();
} }
int UDPServer::readBuffer(char* data) int UDPServer::readBuffer()
{ {
boost::system::error_code error = boost::asio::error::host_not_found; //boost::system::error_code error = boost::asio::error::host_not_found;
unsigned int length = m_Socket->receive_from( //unsigned int length = m_Socket->receive_from(
boost::asio::buffer((void*)data // boost::asio::buffer((void*)data
, BUFFERSIZE) // , BUFFERSIZE)
, m_ReceiverEndpoint, 0, error); // , m_ReceiverEndpoint, 0, error);
if (error) { //if (error) {
LOG_WARNING(error.message().c_str()); // LOG_WARNING(error.message().c_str());
//}
//return length;
if (!m_Socket) {
return 0;
} }
return length; boost::system::error_code error;
// Read size of packet
m_Socket->receive_from(boost
::asio::buffer((void*)m_ReadBuffer, sizeof(int)),
m_ReceiverEndpoint, boost::asio::ip::udp::socket::message_peek, error);
unsigned int sizeOfPacket = 0;
memcpy(&sizeOfPacket, m_ReadBuffer, sizeof(int));
// if the buffer is to small increase the size of it
if (sizeOfPacket > m_BufferSize) {
delete[] m_ReadBuffer;
m_ReadBuffer = new char[sizeOfPacket];
m_BufferSize = sizeOfPacket;
}
// Read the rest of the message
size_t bytesReceived = m_Socket->receive_from(boost
::asio::buffer((void*)(m_ReadBuffer),
sizeOfPacket),
m_ReceiverEndpoint, 0, error);
if (error) {
//LOG_ERROR("receive: %s", error.message().c_str());
}
if (sizeOfPacket > 1000000)
LOG_WARNING("The packets received are bigger than 1MB");
return bytesReceived;
} }
void UDPServer::AcceptNewConnections(int& nextPlayerID, std::map<PlayerID, PlayerDefinition>& connectedPlayers) void UDPServer::AcceptNewConnections(int& nextPlayerID, std::map<PlayerID, PlayerDefinition>& connectedPlayers)