Made it easier to maintain changes in packet header, prepared for reliable UDP packets.

This commit is contained in:
Jocke
2016-03-08 14:44:35 +01:00
parent 9cbc582be2
commit 3828616b60
9 changed files with 91 additions and 56 deletions
+1
View File
@@ -119,6 +119,7 @@ private:
void sendLocalPlayerTransform();
void becomePlayer();
void displayServerlist();
void popNetworkSegmentOfHeader(Packet& packet);
// Mapping Logic
// Returns if local EntityID exist in map
bool clientServerMapsHasEntity(EntityID clientEntityID);
+12 -4
View File
@@ -17,7 +17,8 @@ public:
Packet(MessageType type);
~Packet();
void Init(MessageType type, unsigned int& packetID,
int sequenceNumber, int totalAmountOfPackets);
int sequenceNumber, int totalAmountOfPackets,
int packetGroup);
// Add primitive types like int, float, char...
template<typename T>
@@ -65,9 +66,9 @@ public:
size_t DataReadSize() { return m_ReturnDataOffset; }
size_t MaxSize() { return m_MaxPacketSize; }
size_t HeaderSize() { return m_HeaderSize; }
size_t SequenceNumber();
size_t SequenceLength();
size_t GroupIndex();
size_t GroupSize();
size_t PacketID();
private:
char* m_Data;
size_t m_ReturnDataOffset = 0;
@@ -76,6 +77,13 @@ private:
size_t m_HeaderSize = 0;
void resizeData();
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
+1
View File
@@ -82,6 +82,7 @@ private:
void kick(PlayerID player);
PlayerID getPlayerIDFromEndpoint();
PlayerID getPlayerIDFromEntityID(EntityID entityID);
void popNetworkSegmentOfHeader(Packet & packet);
void parsePlayerTransform(Packet& packet);
void parseOnInputCommand(Packet& packet);
void parseClientPing();
+3 -2
View File
@@ -1,6 +1,6 @@
#ifndef UDPClient_h__
#define UDPClient_h__
#include <unordered_map>
#include <map>
#include <boost/asio.hpp>
#include "Network/NetworkClient.h"
@@ -25,7 +25,8 @@ private:
boost::shared_ptr<boost::asio::ip::udp::socket> m_Socket;
int readBuffer();
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
+14 -12
View File
@@ -104,10 +104,7 @@ void Client::Update()
void Client::parseMessageType(Packet& packet)
{
// Pop packetSize, sequenceNumber and packetsInSequence.
// create a packet of the correct size
packet.ReadPrimitive<int>();
packet.ReadPrimitive<int>();
packet.ReadPrimitive<int>();
popNetworkSegmentOfHeader(packet);
int messageType = packet.ReadPrimitive<int>();
if (messageType == -1)
@@ -170,10 +167,8 @@ void Client::parseUDPConnect(Packet& packet)
void Client::parseTCPConnect(Packet& packet)
{
LOG_INFO("Received TCP connect from server");
// Pop packetSize, sequenceNumber and packetsInSequence.
packet.ReadPrimitive<int>();
packet.ReadPrimitive<int>();
packet.ReadPrimitive<int>();
// Pop packetSize, group, groupIndex and groupSize.
popNetworkSegmentOfHeader(packet);
int messageType = packet.ReadPrimitive<int>();
// Read packet ID
@@ -213,10 +208,8 @@ void Client::parsePing()
void Client::parseServerlist(Packet& packet)
{
// Pop size, message type, and ID
packet.ReadPrimitive<int>();
packet.ReadPrimitive<int>();
packet.ReadPrimitive<int>();
// Pop packetSize, group, groupIndex and groupSize.
popNetworkSegmentOfHeader(packet);
std::string address = packet.ReadString();
int port = packet.ReadPrimitive<int>();
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)
{
if (m_ClientIDToServerID.find(clientEntityID) != m_ClientIDToServerID.end()) {
+36 -24
View File
@@ -3,7 +3,7 @@
Packet::Packet(MessageType type, unsigned int& packetID)
{
m_Data = new char[m_MaxPacketSize];
Init(type, packetID, 1, 1);
Init(type, packetID, 1, 1 , -1);
}
// Create message
@@ -21,7 +21,7 @@ Packet::Packet(MessageType type)
{
m_Data = new char[m_MaxPacketSize];
unsigned int dummy = 0;
Init(type, dummy, 1, 1);
Init(type, dummy, 1, 1, -1);
}
Packet::~Packet()
@@ -30,21 +30,29 @@ Packet::~Packet()
}
void Packet::Init(MessageType type, unsigned int & packetID,
int sequenceNumber, int totalAmountOfPackets)
int groupIndex, int packetGroupSize, int packetGroup)
{
m_ReturnDataOffset = 0;
m_Offset = 0;
// 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
packetSizeOffset = m_Offset;
WritePrimitive<int>(0);
// SequenceNumber and totalAmountOfPackets position in array is hard coded
WritePrimitive(sequenceNumber);
WritePrimitive(totalAmountOfPackets);
// packetGroup is the gorup the packet is in
groupOffset = m_Offset;
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
int messageType = static_cast<int>(type);
messageTypeOffset = m_Offset;
WritePrimitive<int>(messageType);
// Packet ID
packetIDOffset = m_Offset;
WritePrimitive<int>(packetID);
packetID++;
m_HeaderSize = m_Offset;
@@ -129,37 +137,41 @@ void Packet::ChangePacketID(unsigned int & packetID)
{
packetID = packetID + 1;
// 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(&sequenceLength, m_Data + 2 * sizeof(int), sizeof(int));
memcpy(&groupIndex, m_Data + groupIndexOffset, sizeof(int));
memcpy(&groupSize, m_Data + groupSizeOffset, sizeof(int));
}
MessageType Packet::GetMessageType()
{
MessageType messagType;
memcpy(&messagType, m_Data + 3 * sizeof(int), sizeof(int));
memcpy(&messagType, m_Data + messageTypeOffset, sizeof(int));
return messagType;
}
//WritePrimitive(sequenceNumber);
//WritePrimitive(totalAmountOfPackets);
size_t Packet::SequenceNumber()
size_t Packet::GroupIndex()
{
size_t sequenceNumber;
memcpy(&sequenceNumber, m_Data + sizeof(int), sizeof(int));
return sequenceNumber;
size_t groupIndex;
memcpy(&groupIndex, m_Data + groupIndexOffset, sizeof(int));
return groupIndex;
}
size_t Packet::SequenceLength()
size_t Packet::GroupSize()
{
size_t sequenceLength;
memcpy(&sequenceLength, m_Data + 2 * sizeof(int), sizeof(int));
return sequenceLength;
size_t groupSize;
memcpy(&groupSize, m_Data + groupSizeOffset, sizeof(int));
return groupSize;
}
size_t Packet::PacketID()
{
size_t packetID;
memcpy(&packetID, m_Data + packetIDOffset, sizeof(int));
return packetID;
}
void Packet::resizeData()
+12 -10
View File
@@ -109,9 +109,7 @@ void Server::parseMessageType(Packet& packet)
{
// Pop packetSize, sequenceNumber and packetsInSequence.
// create a packet of the correct size
packet.ReadPrimitive<int>();
packet.ReadPrimitive<int>();
packet.ReadPrimitive<int>();
popNetworkSegmentOfHeader(packet);
int messageType = packet.ReadPrimitive<int>(); // Read what type off message was sent from server
// Read packet ID
@@ -163,7 +161,6 @@ void Server::reliableBroadcast(Packet& packet)
void Server::unreliableBroadcast(Packet& packet)
{
for (auto& kv : m_ConnectedPlayers) {
packet.ChangePacketID(kv.second.PacketID);
m_Unreliable.Send(packet, kv.second);
}
}
@@ -325,9 +322,7 @@ void Server::checkForTimeOuts()
void Server::parseUDPConnect(Packet & packet)
{
//Pop packetSize, sequenceNumber and packetsInSequence.
packet.ReadPrimitive<int>();
packet.ReadPrimitive<int>();
packet.ReadPrimitive<int>();
popNetworkSegmentOfHeader(packet);
int messageType = packet.ReadPrimitive<int>();
// Read packet ID
m_PreviousPacketID = m_PacketID; // Set previous packet id
@@ -350,9 +345,7 @@ void Server::parseUDPConnect(Packet & packet)
void Server::parseTCPConnect(Packet & packet)
{
// Pop packetSize, sequenceNumber and packetsInSequence.
packet.ReadPrimitive<int>();
packet.ReadPrimitive<int>();
packet.ReadPrimitive<int>();
popNetworkSegmentOfHeader(packet);
int messageType = packet.ReadPrimitive<int>();
// Read packet ID
@@ -688,3 +681,12 @@ PlayerID Server::getPlayerIDFromEntityID(EntityID entityID)
}
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>();
}
+6 -3
View File
@@ -39,12 +39,15 @@ int UDPClient::readBuffer()
return 0;
}
boost::system::error_code error;
// Peek size of packet
// Peek header
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);
int sizeOfPacket = 0;
memcpy(&sizeOfPacket, m_ReadBuffer, sizeof(int));
int packetID = 0;
memcpy(&packetID, m_ReadBuffer + 4 * sizeof(int), sizeof(int));
if (sizeOfPacket > m_Socket->available()) {
LOG_WARNING("UDPClient::readBuffer(): We haven't got the whole packet yet.");
// return;
@@ -63,7 +66,7 @@ int UDPClient::readBuffer()
if (error) {
//LOG_ERROR("receive: %s", error.message().c_str());
}
// new char [sizeOfPacket] save in map with packetID as key
return bytesReceived;
}
+6 -1
View File
@@ -43,7 +43,12 @@ void UDPServer::Send(Packet& packet, PlayerDefinition & playerDefinition)
0);
packetDataSent = bytesSent - splitPacket.HeaderSize();
++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) {
LOG_INFO(e.what());