Made it easier to maintain changes in packet header, prepared for reliable UDP packets.
This commit is contained in:
@@ -119,6 +119,7 @@ private:
|
|||||||
void sendLocalPlayerTransform();
|
void sendLocalPlayerTransform();
|
||||||
void becomePlayer();
|
void becomePlayer();
|
||||||
void displayServerlist();
|
void displayServerlist();
|
||||||
|
void popNetworkSegmentOfHeader(Packet& packet);
|
||||||
// Mapping Logic
|
// Mapping Logic
|
||||||
// Returns if local EntityID exist in map
|
// Returns if local EntityID exist in map
|
||||||
bool clientServerMapsHasEntity(EntityID clientEntityID);
|
bool clientServerMapsHasEntity(EntityID clientEntityID);
|
||||||
|
|||||||
@@ -17,7 +17,8 @@ public:
|
|||||||
Packet(MessageType type);
|
Packet(MessageType type);
|
||||||
~Packet();
|
~Packet();
|
||||||
void Init(MessageType type, unsigned int& packetID,
|
void Init(MessageType type, unsigned int& packetID,
|
||||||
int sequenceNumber, int totalAmountOfPackets);
|
int sequenceNumber, int totalAmountOfPackets,
|
||||||
|
int packetGroup);
|
||||||
|
|
||||||
// Add primitive types like int, float, char...
|
// Add primitive types like int, float, char...
|
||||||
template<typename T>
|
template<typename T>
|
||||||
@@ -65,9 +66,9 @@ public:
|
|||||||
size_t DataReadSize() { return m_ReturnDataOffset; }
|
size_t DataReadSize() { return m_ReturnDataOffset; }
|
||||||
size_t MaxSize() { return m_MaxPacketSize; }
|
size_t MaxSize() { return m_MaxPacketSize; }
|
||||||
size_t HeaderSize() { return m_HeaderSize; }
|
size_t HeaderSize() { return m_HeaderSize; }
|
||||||
size_t SequenceNumber();
|
size_t GroupIndex();
|
||||||
size_t SequenceLength();
|
size_t GroupSize();
|
||||||
|
size_t PacketID();
|
||||||
private:
|
private:
|
||||||
char* m_Data;
|
char* m_Data;
|
||||||
size_t m_ReturnDataOffset = 0;
|
size_t m_ReturnDataOffset = 0;
|
||||||
@@ -76,6 +77,13 @@ private:
|
|||||||
size_t m_HeaderSize = 0;
|
size_t m_HeaderSize = 0;
|
||||||
void resizeData();
|
void resizeData();
|
||||||
void resizeData(int size);
|
void resizeData(int size);
|
||||||
|
|
||||||
|
size_t packetSizeOffset = 0;
|
||||||
|
size_t groupOffset = 0;
|
||||||
|
size_t groupIndexOffset = 0;
|
||||||
|
size_t groupSizeOffset = 0;
|
||||||
|
size_t messageTypeOffset = 0;
|
||||||
|
size_t packetIDOffset = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -82,6 +82,7 @@ private:
|
|||||||
void kick(PlayerID player);
|
void kick(PlayerID player);
|
||||||
PlayerID getPlayerIDFromEndpoint();
|
PlayerID getPlayerIDFromEndpoint();
|
||||||
PlayerID getPlayerIDFromEntityID(EntityID entityID);
|
PlayerID getPlayerIDFromEntityID(EntityID entityID);
|
||||||
|
void popNetworkSegmentOfHeader(Packet & packet);
|
||||||
void parsePlayerTransform(Packet& packet);
|
void parsePlayerTransform(Packet& packet);
|
||||||
void parseOnInputCommand(Packet& packet);
|
void parseOnInputCommand(Packet& packet);
|
||||||
void parseClientPing();
|
void parseClientPing();
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#ifndef UDPClient_h__
|
#ifndef UDPClient_h__
|
||||||
#define UDPClient_h__
|
#define UDPClient_h__
|
||||||
#include <unordered_map>
|
#include <map>
|
||||||
|
|
||||||
#include <boost/asio.hpp>
|
#include <boost/asio.hpp>
|
||||||
#include "Network/NetworkClient.h"
|
#include "Network/NetworkClient.h"
|
||||||
@@ -25,7 +25,8 @@ private:
|
|||||||
boost::shared_ptr<boost::asio::ip::udp::socket> m_Socket;
|
boost::shared_ptr<boost::asio::ip::udp::socket> m_Socket;
|
||||||
int readBuffer();
|
int readBuffer();
|
||||||
PacketID m_SendPacketID = 0;
|
PacketID m_SendPacketID = 0;
|
||||||
std::unordered_map<unsigned int, boost::shared_ptr<char>> packetSegmentMap;
|
//map:(packetGroup, vector:(pair:(groupIndex, packetData)))
|
||||||
|
std::map<unsigned int, std::vector<std::pair<unsigned int, boost::shared_ptr<char>>>> packetSegmentMap;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -104,10 +104,7 @@ void Client::Update()
|
|||||||
void Client::parseMessageType(Packet& packet)
|
void Client::parseMessageType(Packet& packet)
|
||||||
{
|
{
|
||||||
// Pop packetSize, sequenceNumber and packetsInSequence.
|
// Pop packetSize, sequenceNumber and packetsInSequence.
|
||||||
// create a packet of the correct size
|
popNetworkSegmentOfHeader(packet);
|
||||||
packet.ReadPrimitive<int>();
|
|
||||||
packet.ReadPrimitive<int>();
|
|
||||||
packet.ReadPrimitive<int>();
|
|
||||||
|
|
||||||
int messageType = packet.ReadPrimitive<int>();
|
int messageType = packet.ReadPrimitive<int>();
|
||||||
if (messageType == -1)
|
if (messageType == -1)
|
||||||
@@ -170,10 +167,8 @@ void Client::parseUDPConnect(Packet& packet)
|
|||||||
void Client::parseTCPConnect(Packet& packet)
|
void Client::parseTCPConnect(Packet& packet)
|
||||||
{
|
{
|
||||||
LOG_INFO("Received TCP connect from server");
|
LOG_INFO("Received TCP connect from server");
|
||||||
// Pop packetSize, sequenceNumber and packetsInSequence.
|
// Pop packetSize, group, groupIndex and groupSize.
|
||||||
packet.ReadPrimitive<int>();
|
popNetworkSegmentOfHeader(packet);
|
||||||
packet.ReadPrimitive<int>();
|
|
||||||
packet.ReadPrimitive<int>();
|
|
||||||
|
|
||||||
int messageType = packet.ReadPrimitive<int>();
|
int messageType = packet.ReadPrimitive<int>();
|
||||||
// Read packet ID
|
// Read packet ID
|
||||||
@@ -213,10 +208,8 @@ void Client::parsePing()
|
|||||||
|
|
||||||
void Client::parseServerlist(Packet& packet)
|
void Client::parseServerlist(Packet& packet)
|
||||||
{
|
{
|
||||||
// Pop size, message type, and ID
|
// Pop packetSize, group, groupIndex and groupSize.
|
||||||
packet.ReadPrimitive<int>();
|
popNetworkSegmentOfHeader(packet);
|
||||||
packet.ReadPrimitive<int>();
|
|
||||||
packet.ReadPrimitive<int>();
|
|
||||||
std::string address = packet.ReadString();
|
std::string address = packet.ReadString();
|
||||||
int port = packet.ReadPrimitive<int>();
|
int port = packet.ReadPrimitive<int>();
|
||||||
std::string serverName = packet.ReadString();
|
std::string serverName = packet.ReadString();
|
||||||
@@ -684,6 +677,15 @@ void Client::displayServerlist()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Client::popNetworkSegmentOfHeader(Packet & packet)
|
||||||
|
{
|
||||||
|
// Pop packetSize, group, groupIndex and groupSize.
|
||||||
|
packet.ReadPrimitive<int>();
|
||||||
|
packet.ReadPrimitive<int>();
|
||||||
|
packet.ReadPrimitive<int>();
|
||||||
|
packet.ReadPrimitive<int>();
|
||||||
|
}
|
||||||
|
|
||||||
bool Client::clientServerMapsHasEntity(EntityID clientEntityID)
|
bool Client::clientServerMapsHasEntity(EntityID clientEntityID)
|
||||||
{
|
{
|
||||||
if (m_ClientIDToServerID.find(clientEntityID) != m_ClientIDToServerID.end()) {
|
if (m_ClientIDToServerID.find(clientEntityID) != m_ClientIDToServerID.end()) {
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
Packet::Packet(MessageType type, unsigned int& packetID)
|
Packet::Packet(MessageType type, unsigned int& packetID)
|
||||||
{
|
{
|
||||||
m_Data = new char[m_MaxPacketSize];
|
m_Data = new char[m_MaxPacketSize];
|
||||||
Init(type, packetID, 1, 1);
|
Init(type, packetID, 1, 1 , -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create message
|
// Create message
|
||||||
@@ -21,7 +21,7 @@ Packet::Packet(MessageType type)
|
|||||||
{
|
{
|
||||||
m_Data = new char[m_MaxPacketSize];
|
m_Data = new char[m_MaxPacketSize];
|
||||||
unsigned int dummy = 0;
|
unsigned int dummy = 0;
|
||||||
Init(type, dummy, 1, 1);
|
Init(type, dummy, 1, 1, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
Packet::~Packet()
|
Packet::~Packet()
|
||||||
@@ -30,21 +30,29 @@ Packet::~Packet()
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Packet::Init(MessageType type, unsigned int & packetID,
|
void Packet::Init(MessageType type, unsigned int & packetID,
|
||||||
int sequenceNumber, int totalAmountOfPackets)
|
int groupIndex, int packetGroupSize, int packetGroup)
|
||||||
{
|
{
|
||||||
m_ReturnDataOffset = 0;
|
m_ReturnDataOffset = 0;
|
||||||
m_Offset = 0;
|
m_Offset = 0;
|
||||||
// Create message header
|
// Create message header
|
||||||
// If you add things before here be sure to change in GetMessageType()
|
|
||||||
// SequenceNumber(), SequenceLength(), ChangePacketID()
|
|
||||||
// allocate memory for size of packet, sequenceNumber and totalPacketesInSequence
|
// allocate memory for size of packet, sequenceNumber and totalPacketesInSequence
|
||||||
|
packetSizeOffset = m_Offset;
|
||||||
WritePrimitive<int>(0);
|
WritePrimitive<int>(0);
|
||||||
// SequenceNumber and totalAmountOfPackets position in array is hard coded
|
// packetGroup is the gorup the packet is in
|
||||||
WritePrimitive(sequenceNumber);
|
groupOffset = m_Offset;
|
||||||
WritePrimitive(totalAmountOfPackets);
|
WritePrimitive<int>(packetGroup);
|
||||||
|
// What index the packet has in the packetGroup
|
||||||
|
groupIndexOffset = m_Offset;
|
||||||
|
WritePrimitive(groupIndex);
|
||||||
|
// The total amount of packets in a packetGroup
|
||||||
|
groupSizeOffset = m_Offset;
|
||||||
|
WritePrimitive(packetGroupSize);
|
||||||
// Add message type
|
// Add message type
|
||||||
int messageType = static_cast<int>(type);
|
int messageType = static_cast<int>(type);
|
||||||
|
messageTypeOffset = m_Offset;
|
||||||
WritePrimitive<int>(messageType);
|
WritePrimitive<int>(messageType);
|
||||||
|
// Packet ID
|
||||||
|
packetIDOffset = m_Offset;
|
||||||
WritePrimitive<int>(packetID);
|
WritePrimitive<int>(packetID);
|
||||||
packetID++;
|
packetID++;
|
||||||
m_HeaderSize = m_Offset;
|
m_HeaderSize = m_Offset;
|
||||||
@@ -129,37 +137,41 @@ void Packet::ChangePacketID(unsigned int & packetID)
|
|||||||
{
|
{
|
||||||
packetID = packetID + 1;
|
packetID = packetID + 1;
|
||||||
// Overwrite old PacketID
|
// Overwrite old PacketID
|
||||||
memcpy(m_Data + 4 * sizeof(int), &packetID, sizeof(int));
|
memcpy(m_Data + packetIDOffset, &packetID, sizeof(int));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Packet::ChangeSequenceNumber(int sequenceNumber, int sequenceLength)
|
void Packet::ChangeSequenceNumber(int groupIndex, int groupSize)
|
||||||
{
|
{
|
||||||
memcpy(&sequenceNumber, m_Data + sizeof(int), sizeof(int));
|
memcpy(&groupIndex, m_Data + groupIndexOffset, sizeof(int));
|
||||||
memcpy(&sequenceLength, m_Data + 2 * sizeof(int), sizeof(int));
|
memcpy(&groupSize, m_Data + groupSizeOffset, sizeof(int));
|
||||||
}
|
}
|
||||||
|
|
||||||
MessageType Packet::GetMessageType()
|
MessageType Packet::GetMessageType()
|
||||||
{
|
{
|
||||||
MessageType messagType;
|
MessageType messagType;
|
||||||
memcpy(&messagType, m_Data + 3 * sizeof(int), sizeof(int));
|
memcpy(&messagType, m_Data + messageTypeOffset, sizeof(int));
|
||||||
return messagType;
|
return messagType;
|
||||||
}
|
}
|
||||||
|
|
||||||
//WritePrimitive(sequenceNumber);
|
size_t Packet::GroupIndex()
|
||||||
//WritePrimitive(totalAmountOfPackets);
|
|
||||||
|
|
||||||
size_t Packet::SequenceNumber()
|
|
||||||
{
|
{
|
||||||
size_t sequenceNumber;
|
size_t groupIndex;
|
||||||
memcpy(&sequenceNumber, m_Data + sizeof(int), sizeof(int));
|
memcpy(&groupIndex, m_Data + groupIndexOffset, sizeof(int));
|
||||||
return sequenceNumber;
|
return groupIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t Packet::SequenceLength()
|
size_t Packet::GroupSize()
|
||||||
{
|
{
|
||||||
size_t sequenceLength;
|
size_t groupSize;
|
||||||
memcpy(&sequenceLength, m_Data + 2 * sizeof(int), sizeof(int));
|
memcpy(&groupSize, m_Data + groupSizeOffset, sizeof(int));
|
||||||
return sequenceLength;
|
return groupSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t Packet::PacketID()
|
||||||
|
{
|
||||||
|
size_t packetID;
|
||||||
|
memcpy(&packetID, m_Data + packetIDOffset, sizeof(int));
|
||||||
|
return packetID;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Packet::resizeData()
|
void Packet::resizeData()
|
||||||
|
|||||||
@@ -109,9 +109,7 @@ void Server::parseMessageType(Packet& packet)
|
|||||||
{
|
{
|
||||||
// Pop packetSize, sequenceNumber and packetsInSequence.
|
// Pop packetSize, sequenceNumber and packetsInSequence.
|
||||||
// create a packet of the correct size
|
// create a packet of the correct size
|
||||||
packet.ReadPrimitive<int>();
|
popNetworkSegmentOfHeader(packet);
|
||||||
packet.ReadPrimitive<int>();
|
|
||||||
packet.ReadPrimitive<int>();
|
|
||||||
|
|
||||||
int messageType = packet.ReadPrimitive<int>(); // Read what type off message was sent from server
|
int messageType = packet.ReadPrimitive<int>(); // Read what type off message was sent from server
|
||||||
// Read packet ID
|
// Read packet ID
|
||||||
@@ -163,7 +161,6 @@ void Server::reliableBroadcast(Packet& packet)
|
|||||||
void Server::unreliableBroadcast(Packet& packet)
|
void Server::unreliableBroadcast(Packet& packet)
|
||||||
{
|
{
|
||||||
for (auto& kv : m_ConnectedPlayers) {
|
for (auto& kv : m_ConnectedPlayers) {
|
||||||
packet.ChangePacketID(kv.second.PacketID);
|
|
||||||
m_Unreliable.Send(packet, kv.second);
|
m_Unreliable.Send(packet, kv.second);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -325,9 +322,7 @@ void Server::checkForTimeOuts()
|
|||||||
void Server::parseUDPConnect(Packet & packet)
|
void Server::parseUDPConnect(Packet & packet)
|
||||||
{
|
{
|
||||||
//Pop packetSize, sequenceNumber and packetsInSequence.
|
//Pop packetSize, sequenceNumber and packetsInSequence.
|
||||||
packet.ReadPrimitive<int>();
|
popNetworkSegmentOfHeader(packet);
|
||||||
packet.ReadPrimitive<int>();
|
|
||||||
packet.ReadPrimitive<int>();
|
|
||||||
int messageType = packet.ReadPrimitive<int>();
|
int messageType = packet.ReadPrimitive<int>();
|
||||||
// Read packet ID
|
// Read packet ID
|
||||||
m_PreviousPacketID = m_PacketID; // Set previous packet id
|
m_PreviousPacketID = m_PacketID; // Set previous packet id
|
||||||
@@ -350,9 +345,7 @@ void Server::parseUDPConnect(Packet & packet)
|
|||||||
void Server::parseTCPConnect(Packet & packet)
|
void Server::parseTCPConnect(Packet & packet)
|
||||||
{
|
{
|
||||||
// Pop packetSize, sequenceNumber and packetsInSequence.
|
// Pop packetSize, sequenceNumber and packetsInSequence.
|
||||||
packet.ReadPrimitive<int>();
|
popNetworkSegmentOfHeader(packet);
|
||||||
packet.ReadPrimitive<int>();
|
|
||||||
packet.ReadPrimitive<int>();
|
|
||||||
|
|
||||||
int messageType = packet.ReadPrimitive<int>();
|
int messageType = packet.ReadPrimitive<int>();
|
||||||
// Read packet ID
|
// Read packet ID
|
||||||
@@ -688,3 +681,12 @@ PlayerID Server::getPlayerIDFromEntityID(EntityID entityID)
|
|||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Server::popNetworkSegmentOfHeader(Packet & packet)
|
||||||
|
{
|
||||||
|
// Pop packetSize, group, groupIndex and groupSize.
|
||||||
|
packet.ReadPrimitive<int>();
|
||||||
|
packet.ReadPrimitive<int>();
|
||||||
|
packet.ReadPrimitive<int>();
|
||||||
|
packet.ReadPrimitive<int>();
|
||||||
|
}
|
||||||
@@ -39,12 +39,15 @@ int UDPClient::readBuffer()
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
boost::system::error_code error;
|
boost::system::error_code error;
|
||||||
// Peek size of packet
|
// Peek header
|
||||||
m_Socket->receive(boost
|
m_Socket->receive(boost
|
||||||
::asio::buffer((void*)m_ReadBuffer, sizeof(int)),
|
::asio::buffer((void*)m_ReadBuffer, 5 * sizeof(int)),
|
||||||
boost::asio::ip::udp::socket::message_peek, error);
|
boost::asio::ip::udp::socket::message_peek, error);
|
||||||
int sizeOfPacket = 0;
|
int sizeOfPacket = 0;
|
||||||
memcpy(&sizeOfPacket, m_ReadBuffer, sizeof(int));
|
memcpy(&sizeOfPacket, m_ReadBuffer, sizeof(int));
|
||||||
|
int packetID = 0;
|
||||||
|
memcpy(&packetID, m_ReadBuffer + 4 * sizeof(int), sizeof(int));
|
||||||
|
|
||||||
if (sizeOfPacket > m_Socket->available()) {
|
if (sizeOfPacket > m_Socket->available()) {
|
||||||
LOG_WARNING("UDPClient::readBuffer(): We haven't got the whole packet yet.");
|
LOG_WARNING("UDPClient::readBuffer(): We haven't got the whole packet yet.");
|
||||||
// return;
|
// return;
|
||||||
@@ -63,7 +66,7 @@ int UDPClient::readBuffer()
|
|||||||
if (error) {
|
if (error) {
|
||||||
//LOG_ERROR("receive: %s", error.message().c_str());
|
//LOG_ERROR("receive: %s", error.message().c_str());
|
||||||
}
|
}
|
||||||
|
// new char [sizeOfPacket] save in map with packetID as key
|
||||||
return bytesReceived;
|
return bytesReceived;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -43,7 +43,12 @@ void UDPServer::Send(Packet& packet, PlayerDefinition & playerDefinition)
|
|||||||
0);
|
0);
|
||||||
packetDataSent = bytesSent - splitPacket.HeaderSize();
|
packetDataSent = bytesSent - splitPacket.HeaderSize();
|
||||||
++sequenceNumber;
|
++sequenceNumber;
|
||||||
int sizeasdasd = splitPacket.ReadPrimitive<int>();
|
int packetsise = splitPacket.ReadPrimitive<int>();
|
||||||
|
int groopOffset = splitPacket.ReadPrimitive<int>();
|
||||||
|
int groopIndes = splitPacket.ReadPrimitive<int>();
|
||||||
|
int groopSiseOffset = splitPacket.ReadPrimitive<int>();
|
||||||
|
int mezzagetype = splitPacket.ReadPrimitive<int>();
|
||||||
|
int pakketIDOffset = splitPacket.ReadPrimitive<int>();
|
||||||
}
|
}
|
||||||
} catch (const boost::system::system_error& e) {
|
} catch (const boost::system::system_error& e) {
|
||||||
LOG_INFO(e.what());
|
LOG_INFO(e.what());
|
||||||
|
|||||||
Reference in New Issue
Block a user