Merge branch 'master' into Playerbot
This commit is contained in:
@@ -161,43 +161,53 @@ void WorldSocket::CheckIpCallback(PreparedQueryResult result)
|
||||
bool WorldSocket::Update()
|
||||
{
|
||||
EncryptableAndCompressiblePacket* queued;
|
||||
MessageBuffer buffer(_sendBufferSize);
|
||||
while (_bufferQueue.Dequeue(queued))
|
||||
if (_bufferQueue.Dequeue(queued))
|
||||
{
|
||||
queued->CompressIfNeeded();
|
||||
|
||||
ServerPktHeader header(queued->size() + 2, queued->GetOpcode());
|
||||
if (queued->NeedsEncryption())
|
||||
_authCrypt.EncryptSend(header.header, header.getHeaderLength());
|
||||
|
||||
if (buffer.GetRemainingSpace() < queued->size() + header.getHeaderLength())
|
||||
// Allocate buffer only when it's needed but not on every Update() call.
|
||||
MessageBuffer buffer(_sendBufferSize);
|
||||
std::size_t currentPacketSize;
|
||||
do
|
||||
{
|
||||
queued->CompressIfNeeded();
|
||||
ServerPktHeader header(queued->size() + 2, queued->GetOpcode());
|
||||
if (queued->NeedsEncryption())
|
||||
_authCrypt.EncryptSend(header.header, header.getHeaderLength());
|
||||
|
||||
currentPacketSize = queued->size() + header.getHeaderLength();
|
||||
|
||||
if (buffer.GetRemainingSpace() < currentPacketSize)
|
||||
{
|
||||
QueuePacket(std::move(buffer));
|
||||
buffer.Resize(_sendBufferSize);
|
||||
}
|
||||
|
||||
if (buffer.GetRemainingSpace() >= currentPacketSize)
|
||||
{
|
||||
buffer.Write(header.header, header.getHeaderLength());
|
||||
if (!queued->empty())
|
||||
buffer.Write(queued->contents(), queued->size());
|
||||
}
|
||||
else // Single packet larger than current buffer size
|
||||
{
|
||||
// Resize buffer to fit current packet
|
||||
buffer.Resize(currentPacketSize);
|
||||
|
||||
// Grow future buffers to current packet size if still below limit
|
||||
if (currentPacketSize <= 65536)
|
||||
_sendBufferSize = currentPacketSize;
|
||||
|
||||
buffer.Write(header.header, header.getHeaderLength());
|
||||
if (!queued->empty())
|
||||
buffer.Write(queued->contents(), queued->size());
|
||||
}
|
||||
|
||||
delete queued;
|
||||
} while (_bufferQueue.Dequeue(queued));
|
||||
|
||||
if (buffer.GetActiveSize() > 0)
|
||||
QueuePacket(std::move(buffer));
|
||||
buffer.Resize(_sendBufferSize);
|
||||
}
|
||||
|
||||
if (buffer.GetRemainingSpace() >= queued->size() + header.getHeaderLength())
|
||||
{
|
||||
buffer.Write(header.header, header.getHeaderLength());
|
||||
if (!queued->empty())
|
||||
buffer.Write(queued->contents(), queued->size());
|
||||
}
|
||||
else // single packet larger than 4096 bytes
|
||||
{
|
||||
MessageBuffer packetBuffer(queued->size() + header.getHeaderLength());
|
||||
packetBuffer.Write(header.header, header.getHeaderLength());
|
||||
if (!queued->empty())
|
||||
packetBuffer.Write(queued->contents(), queued->size());
|
||||
|
||||
QueuePacket(std::move(packetBuffer));
|
||||
}
|
||||
|
||||
delete queued;
|
||||
}
|
||||
|
||||
if (buffer.GetActiveSize() > 0)
|
||||
QueuePacket(std::move(buffer));
|
||||
|
||||
if (!BaseSocket::Update())
|
||||
return false;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user