diff options
author | Kae <80987908+Novaenia@users.noreply.github.com> | 2024-03-15 15:26:38 +1100 |
---|---|---|
committer | Kae <80987908+Novaenia@users.noreply.github.com> | 2024-03-15 15:26:38 +1100 |
commit | 6208636d69b5fde1d01d9361748c565d35816e20 (patch) | |
tree | 9d6022a5463b099b899bf36184e57127b81dd70b /source/game/StarNetPacketSocket.cpp | |
parent | 662b83ff92cc2316fb962ff1608359f6d705a5f0 (diff) |
Fixes
Diffstat (limited to 'source/game/StarNetPacketSocket.cpp')
-rw-r--r-- | source/game/StarNetPacketSocket.cpp | 60 |
1 files changed, 31 insertions, 29 deletions
diff --git a/source/game/StarNetPacketSocket.cpp b/source/game/StarNetPacketSocket.cpp index 2ebaadb..e1feb1a 100644 --- a/source/game/StarNetPacketSocket.cpp +++ b/source/game/StarNetPacketSocket.cpp @@ -212,8 +212,8 @@ List<PacketPtr> TcpPacketSocket::receivePackets() { uint64_t const PacketBatchLimit = 131072; List<PacketPtr> packets; try { - DataStreamExternalBuffer ds(m_inputBuffer.ptr(), m_inputBuffer.size()); - bool atLeastOne = false; + DataStreamExternalBuffer ds(m_inputBuffer); + size_t trimPos = 0; while (!ds.atEnd()) { PacketType packetType; uint64_t packetSize = 0; @@ -233,19 +233,19 @@ List<PacketPtr> TcpPacketSocket::receivePackets() { if (packetSize > PacketSizeLimit) throw IOException::format("{} bytes large {} exceeds max size!", packetSize, PacketTypeNames.getRight(packetType)); - if (packetSize > ds.size() - ds.pos()) + if (packetSize > ds.remaining()) break; - atLeastOne = true; m_incomingStats.mix(packetType, packetSize, !m_useCompressionStream); DataStreamExternalBuffer packetStream(ds.ptr() + ds.pos(), packetSize); ByteArray uncompressed; if (packetCompressed) { - uncompressed = uncompressData(packetStream.ptr() + packetStream.pos(), packetSize, PacketSizeLimit); + uncompressed = uncompressData(packetStream.ptr(), packetSize, PacketSizeLimit); packetStream.reset(uncompressed.ptr(), uncompressed.size()); } ds.seek(packetSize, IOSeek::Relative); + trimPos = ds.pos(); size_t count = 0; do { @@ -262,10 +262,10 @@ List<PacketPtr> TcpPacketSocket::receivePackets() { packets.append(std::move(packet)); } while (!packetStream.atEnd()); } - if (atLeastOne) - m_inputBuffer.trimLeft(ds.pos()); + if (trimPos) + m_inputBuffer.trimLeft(trimPos); } catch (IOException const& e) { - Logger::warn("I/O error in TcpPacketSocket::readPackets, closing: {}", outputException(e, false)); + Logger::warn("I/O error in TcpPacketSocket::receivePackets, closing: {}", outputException(e, false)); m_inputBuffer.clear(); m_socket->shutdown(); } @@ -282,30 +282,32 @@ bool TcpPacketSocket::writeData() { bool dataSent = false; try { - if (m_useCompressionStream) { - auto compressed = m_compressionStream.compress(m_outputBuffer); - m_outputBuffer.clear(); - - m_compressedBuffer.append(compressed.ptr(), compressed.size()); - size_t written = m_socket->send(m_compressedBuffer.ptr(), m_compressedBuffer.size()); - if (written > 0) { - dataSent = true; - m_compressedBuffer.trimLeft(written); - m_outgoingStats.mix(written); - } - } else { - while (!m_outputBuffer.empty()) { - size_t written = m_socket->send(m_outputBuffer.ptr(), m_outputBuffer.size()); - if (written == 0) - break; - dataSent = true; - m_outputBuffer.trimLeft(written); + if (!m_outputBuffer.empty()) { + if (m_useCompressionStream) { + auto compressed = m_compressionStream.compress(m_outputBuffer); + m_outputBuffer.clear(); + + m_compressedBuffer.append(compressed.ptr(), compressed.size()); + size_t written = m_socket->send(m_compressedBuffer.ptr(), m_compressedBuffer.size()); + if (written > 0) { + dataSent = true; + m_compressedBuffer.trimLeft(written); + m_outgoingStats.mix(written); + } + } else { + do { + size_t written = m_socket->send(m_outputBuffer.ptr(), m_outputBuffer.size()); + if (written == 0) + break; + dataSent = true; + m_outputBuffer.trimLeft(written); + } while (!m_outputBuffer.empty()); } } } catch (SocketClosedException const& e) { Logger::debug("TcpPacketSocket socket closed: {}", outputException(e, false)); } catch (IOException const& e) { - Logger::warn("I/O error in TcpPacketSocket::sendData: {}", outputException(e, false)); + Logger::warn("I/O error in TcpPacketSocket::writeData: {}", outputException(e, false)); m_socket->shutdown(); } return dataSent; @@ -320,8 +322,8 @@ bool TcpPacketSocket::readData() { if (readAmount == 0) break; dataReceived = true; - m_incomingStats.mix(readAmount); if (m_useCompressionStream) { + m_incomingStats.mix(readAmount); auto decompressed = m_decompressionStream.decompress(readBuffer, readAmount); m_inputBuffer.append(decompressed.ptr(), decompressed.size()); } else { @@ -435,7 +437,7 @@ List<PacketPtr> P2PPacketSocket::receivePackets() { } while (!packetStream.atEnd()); } } catch (IOException const& e) { - Logger::warn("I/O error in P2PPacketSocket::readPackets, closing: {}", outputException(e, false)); + Logger::warn("I/O error in P2PPacketSocket::receivePackets, closing: {}", outputException(e, false)); m_socket.reset(); } return packets; |