SocketStatus NetworkManager::receive(sf::Packet& PacketToReceive) { // initialize pendingPacket std::vector<char> myPendingPacket; myPendingPacket.clear(); // We start by getting the size of the incoming packet sf::Uint32 PacketSize = 0; std::size_t Received = 0; PacketSize =receiveB<sf::Uint32>(); PacketSize = ntohl(PacketSize); // Then loop until we receive all the packet data char Buffer[1024]; while (myPendingPacket.size() < PacketSize) { // Receive a chunk of data std::size_t SizeToGet = std::min(static_cast<std::size_t>(PacketSize - myPendingPacket.size()), sizeof(Buffer)); SocketStatus Status = Receive(Buffer, SizeToGet, Received); if (Status != Done) { throw std::runtime_error("Network : receive packet : receive of information didn't worked"); } // Append it into the packet if (Received > 0) { myPendingPacket.resize(myPendingPacket.size() + Received); char* Begin = &myPendingPacket[0] + myPendingPacket.size() - Received; memcpy(Begin, Buffer, Received); } } // We have received all the datas : we can copy it to the user packet, and clear our internal packet PacketToReceive.Clear(); if (!myPendingPacket.empty()) PacketToReceive.OnReceive(&myPendingPacket[0], myPendingPacket.size()); return Done; }