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 becomePlayer();
|
||||
void displayServerlist();
|
||||
void popNetworkSegmentOfHeader(Packet& packet);
|
||||
// Mapping Logic
|
||||
// Returns if local EntityID exist in map
|
||||
bool clientServerMapsHasEntity(EntityID clientEntityID);
|
||||
|
||||
@@ -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
|
||||
@@ -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();
|
||||
|
||||
@@ -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
|
||||
@@ -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()) {
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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>();
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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());
|
||||
|
||||
Reference in New Issue
Block a user