1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-04-17 11:56:46 +02:00

Connection buffered read cpack.

This commit is contained in:
Andrii Danylchenko 2022-12-26 21:28:36 +02:00
parent cb13064a62
commit c271f9187f
2 changed files with 37 additions and 9 deletions

View File

@ -162,17 +162,17 @@ void CConnection::flushBuffers()
int CConnection::write(const void * data, unsigned size) int CConnection::write(const void * data, unsigned size)
{ {
if(enableBufferedWrite)
{
std::ostream ostream(&writeBuffer);
ostream.write(static_cast<const char *>(data), size);
return size;
}
try try
{ {
if(enableBufferedWrite)
{
std::ostream ostream(&writeBuffer);
ostream.write(static_cast<const char *>(data), size);
return size;
}
int ret; int ret;
ret = static_cast<int>(asio::write(*socket,asio::const_buffers_1(asio::const_buffer(data,size)))); ret = static_cast<int>(asio::write(*socket,asio::const_buffers_1(asio::const_buffer(data,size))));
return ret; return ret;
@ -189,6 +189,24 @@ int CConnection::read(void * data, unsigned size)
{ {
try try
{ {
if(enableBufferedRead)
{
auto available = readBuffer.size();
while(available < size)
{
auto bytesRead = socket->read_some(readBuffer.prepare(1024));
readBuffer.commit(bytesRead);
available = readBuffer.size();
}
std::istream istream(&readBuffer);
istream.read(static_cast<char *>(data), size);
return size;
}
int ret = static_cast<int>(asio::read(*socket,asio::mutable_buffers_1(asio::mutable_buffer(data,size)))); int ret = static_cast<int>(asio::read(*socket,asio::mutable_buffers_1(asio::mutable_buffer(data,size))));
return ret; return ret;
} }
@ -243,6 +261,8 @@ void CConnection::reportState(vstd::CLoggerBase * out)
CPack * CConnection::retrievePack() CPack * CConnection::retrievePack()
{ {
enableBufferedRead = true;
CPack * pack = nullptr; CPack * pack = nullptr;
boost::unique_lock<boost::mutex> lock(*mutexRead); boost::unique_lock<boost::mutex> lock(*mutexRead);
iser & pack; iser & pack;
@ -255,6 +275,9 @@ CPack * CConnection::retrievePack()
{ {
pack->c = this->shared_from_this(); pack->c = this->shared_from_this();
} }
enableBufferedRead = false;
return pack; return pack;
} }

View File

@ -21,6 +21,8 @@ namespace boost
{ {
namespace asio namespace asio
{ {
class streambuf;
namespace ip namespace ip
{ {
class tcp; class tcp;
@ -70,6 +72,9 @@ class DLL_LINKAGE CConnection
bool enableBufferedWrite; bool enableBufferedWrite;
boost::asio::streambuf writeBuffer; boost::asio::streambuf writeBuffer;
bool enableBufferedRead;
boost::asio::streambuf readBuffer;
public: public:
BinaryDeserializer iser; BinaryDeserializer iser;
BinarySerializer oser; BinarySerializer oser;