From 67dfbfff0179fa1966acf861f7a09856cf237f20 Mon Sep 17 00:00:00 2001 From: Jocke Date: Thu, 10 Mar 2016 14:44:06 +0100 Subject: [PATCH] Fixed multiply connections --- include/Engine/Network/Packet.h | 4 +- include/Engine/Network/UDPServer.h | 1 + src/Engine/Network/Packet.cpp | 12 +++++- src/Engine/Network/Server.cpp | 4 +- src/Engine/Network/UDPClient.cpp | 3 +- src/Engine/Network/UDPServer.cpp | 68 +++++++++++++++++++++++++++--- 6 files changed, 79 insertions(+), 13 deletions(-) diff --git a/include/Engine/Network/Packet.h b/include/Engine/Network/Packet.h index c885e59a..db6f0aa0 100644 --- a/include/Engine/Network/Packet.h +++ b/include/Engine/Network/Packet.h @@ -60,7 +60,9 @@ public: void UpdateSize(); char* ReadData(int SizeOfData); void ChangePacketID(unsigned int& packetID); - void ChangeSequenceNumber(int sequenceNumber, int sequenceLength, int groupNumber); + void ChangeGroupIndex(int groupIndex); + void ChangeGroupSize(int groupSize); + void ChangeGroup(int group); size_t Size() { return m_Offset; }; char* Data() { return m_Data; }; MessageType GetMessageType(); diff --git a/include/Engine/Network/UDPServer.h b/include/Engine/Network/UDPServer.h index 1d37f642..19b5531c 100644 --- a/include/Engine/Network/UDPServer.h +++ b/include/Engine/Network/UDPServer.h @@ -14,6 +14,7 @@ public: void AcceptNewConnections(int& nextPlayerID, std::map& connectedPlayers); void Receive(Packet & packet, PlayerDefinition & playerDefinition); void Send(Packet & packet, PlayerDefinition & playerDefinition); + void SendToConnectedPlayers(Packet & packet, std::map& playersTosendTo); void Send(Packet & packet); void Send(Packet & packet, boost::asio::ip::udp::endpoint endpoint); void Broadcast(Packet & packet, int port); diff --git a/src/Engine/Network/Packet.cpp b/src/Engine/Network/Packet.cpp index 3e4bf043..8d470d06 100644 --- a/src/Engine/Network/Packet.cpp +++ b/src/Engine/Network/Packet.cpp @@ -146,11 +146,19 @@ void Packet::ChangePacketID(unsigned int & packetID) memcpy(m_Data + packetIDOffset, &packetID, sizeof(int)); } -void Packet::ChangeSequenceNumber(int groupIndex, int groupSize, int groupNumber) +void Packet::ChangeGroupIndex(int groupIndex) { memcpy(m_Data + groupIndexOffset, &groupIndex, sizeof(int)); +} + +void Packet::ChangeGroupSize(int groupSize) +{ memcpy(m_Data + groupSizeOffset, &groupSize, sizeof(int)); - memcpy(m_Data + groupOffset, &groupNumber, sizeof(int)); +} + +void Packet::ChangeGroup(int group) +{ + memcpy(m_Data + groupOffset, &group, sizeof(int)); } MessageType Packet::GetMessageType() diff --git a/src/Engine/Network/Server.cpp b/src/Engine/Network/Server.cpp index ba5295b7..2b11b9c3 100644 --- a/src/Engine/Network/Server.cpp +++ b/src/Engine/Network/Server.cpp @@ -164,9 +164,7 @@ void Server::reliableBroadcast(Packet& packet) void Server::unreliableBroadcast(Packet& packet) { - for (auto& kv : m_ConnectedPlayers) { - m_Unreliable.Send(packet, kv.second); - } + m_Unreliable.SendToConnectedPlayers(packet, m_ConnectedPlayers); } // Send snapshot fields diff --git a/src/Engine/Network/UDPClient.cpp b/src/Engine/Network/UDPClient.cpp index 66ebce12..5bd3877e 100644 --- a/src/Engine/Network/UDPClient.cpp +++ b/src/Engine/Network/UDPClient.cpp @@ -1,4 +1,5 @@ #include "Network/UDPClient.h" +#include "boost/asio/basic_datagram_socket.hpp" using namespace boost::asio::ip; @@ -15,9 +16,9 @@ bool UDPClient::Connect(std::string playerName, std::string address, int port) } m_ReceiverEndpoint = udp::endpoint(boost::asio::ip::address().from_string(address), port); m_Socket = boost::shared_ptr(new boost::asio::ip::udp::socket(m_IOService)); + m_Socket->open(boost::asio::ip::udp::v4()); boost::asio::socket_base::receive_buffer_size option(819200); m_Socket->set_option(option); - m_Socket->open(boost::asio::ip::udp::v4()); return true; } diff --git a/src/Engine/Network/UDPServer.cpp b/src/Engine/Network/UDPServer.cpp index cf6844d9..818fa8fb 100644 --- a/src/Engine/Network/UDPServer.cpp +++ b/src/Engine/Network/UDPServer.cpp @@ -13,7 +13,7 @@ UDPServer::UDPServer(int port) UDPServer::~UDPServer() { } // TODO: Fix correct groups -void UDPServer::Send(Packet& packet, PlayerDefinition & playerDefinition) +void UDPServer::Send(Packet& packet, PlayerDefinition& playerDefinition) { packet.UpdateSize(); try { @@ -23,14 +23,16 @@ void UDPServer::Send(Packet& packet, PlayerDefinition & playerDefinition) // Remove header from packet. packet.ReadData(packet.HeaderSize()); int totalBytesSent = 0; - int sequenceNumber = 1; - int totalMessages = std::ceil((float)packet.Size() / MAXPACKETSIZE); + int groupIndex = 1; + int groupSize = std::ceil((float)packet.Size() / MAXPACKETSIZE); int packetDataSent = 0; int packetDataSize = packet.Size() - packet.HeaderSize(); while (packetDataSize > packetDataSent) { Packet splitPacket(packet.GetMessageType(), playerDefinition.PacketID); - splitPacket.ChangeSequenceNumber(sequenceNumber, totalMessages, playerDefinition.PacketGroup); + splitPacket.ChangeGroupIndex(groupIndex); + splitPacket.ChangeGroupSize(groupSize); + splitPacket.ChangeGroup(playerDefinition.PacketGroup); int amountToSend = packetDataSize - packetDataSent; if (amountToSend > MAXPACKETSIZE) { amountToSend = MAXPACKETSIZE; @@ -46,8 +48,8 @@ void UDPServer::Send(Packet& packet, PlayerDefinition & playerDefinition) 0); packetDataSent += bytesSent - splitPacket.HeaderSize(); totalBytesSent += bytesSent; - // LOG_INFO("bytesSent size %i, groupIndex: %i. Number of packets: %i", bytesSent, sequenceNumber, totalMessages); - ++sequenceNumber; + //LOG_INFO("bytesSent size %i, groupIndex: %i. Number of packets: %i", bytesSent, sequenceNumber, totalMessages); + ++groupIndex; } playerDefinition.PacketGroup++; } catch (const boost::system::system_error& e) { @@ -56,6 +58,60 @@ void UDPServer::Send(Packet& packet, PlayerDefinition & playerDefinition) playerDefinition.Endpoint = boost::asio::ip::udp::endpoint(); } } + +void UDPServer::SendToConnectedPlayers(Packet& packet, std::map& playersTosendTo) +{ + // Work in progress + packet.UpdateSize(); + + //Debug + int debugTheSixeOfpacket = packet.Size(); + //Debug end + // Remove header from packet. + packet.ReadData(packet.HeaderSize()); + int totalBytesSent = 0; + int groupIndex = 1; + int groupSize = std::ceil((float)packet.Size() / MAXPACKETSIZE); + int packetDataSent = 0; + int packetDataSize = packet.Size() - packet.HeaderSize(); + + while (packetDataSize > packetDataSent) { + Packet splitPacket(packet.GetMessageType()); + splitPacket.ChangeGroupIndex(groupIndex); + splitPacket.ChangeGroupSize(groupSize); + int amountToSend = packetDataSize - packetDataSent; + if (amountToSend > MAXPACKETSIZE) { + amountToSend = MAXPACKETSIZE; + } + splitPacket.WriteData(packet.ReadData(amountToSend), amountToSend); + splitPacket.UpdateSize(); + // Remove header size from bytes sent soo that we only + // count data in the packet + int bytesSent = 0; + for (auto& kv : playersTosendTo) { + try { + splitPacket.ChangeGroup(kv.second.PacketGroup); + bytesSent = m_Socket->send_to( + boost::asio::buffer(splitPacket.Data(), splitPacket.Size()), + kv.second.Endpoint, + 0); + } catch (const boost::system::system_error& e) { + LOG_INFO(e.what()); + // TODO: Clean up invalid endpoints out of m_ConnectedPlayers later + kv.second.Endpoint = boost::asio::ip::udp::endpoint(); + } + } + packetDataSent += splitPacket.Size() - splitPacket.HeaderSize(); + totalBytesSent += splitPacket.Size(); + + //LOG_INFO("bytesSent size %i, groupIndex: %i. Number of packets: %i", bytesSent, sequenceNumber, totalMessages); + ++groupIndex; + } + for (auto& kv : playersTosendTo) { + kv.second.PacketGroup++; + } +} + // Send back to endpoint of received packet void UDPServer::Send(Packet & packet) {