Теряется часть данных при отправке через TCP

Я пишу программу, которая может получать от сервера большие пакеты данных (>1 МБ).

И если с маленькими пакетами все работает хорошо, то с большими начинает происходить непонятная потеря последних 495 байт (первая итерация recv успешна, но на следующей поток зависает). И это число не меняется если прибавлять или убавлять размер передаваемых сервером данных. (Отладка серверной части показала, что отправка всего пакета прошла успешно. Проблема только при получении.)

Я использую sendall и recvall следующей реализации:

#define POINTER_OFFSET( ptr, offset ) ( decltype( ptr ) )( DWORD64( ptr ) + DWORD64( offset ) )

bool WTCPClient::send( std::vector< std::uint8_t > data )
{
    auto total = int { };
    auto bytes_left = data.size( );
    auto n = int { };
    while ( total < bytes_left )
    {
        n = ::send( this->socket, ( char * )POINTER_OFFSET( data.data( ), total ), bytes_left, 0 );
        if ( n == SOCKET_ERROR )
        {
            closesocket( this->socket );
            WSACleanup( );

            this->server->user_list.erase( this->socket );
            return false;
        }

        total += n;
        bytes_left -= n;
    }

    return true;
}
bool WTCPClient::recv( char *data, int data_size )
{
    auto total = int { };
    auto bytes_left = data_size;
    auto n = int { };
    while ( bytes_left > 0 )
    {
        n = ::recv( this->client_sock, ( char * )POINTER_OFFSET( data, total ), bytes_left, 0 );
        if ( n == SOCKET_ERROR )
        {
            return false;
        }

        total += n;
        bytes_left -= n;
    }

    return true;
}

Ответы (0 шт):