Повысьте нарушение прав чтения Asio TCP на async_write_some - PullRequest
0 голосов
/ 01 мая 2020

У меня есть настройка сервера с использованием Boost Asio, это нормально, когда дело доходит до принятия новых подключений и обработки их. Однако, когда я пытаюсь буферизовать char* данные в сокет, используя async_write_some, я получаю сообщение об ошибке нарушения прав чтения.

Похоже, проблема связана с временем жизни объекта буфера? Я искал различные решения этой проблемы, но мне еще не удалось найти решение, которое не взломало бы sh сервер.

Вот некоторый код

void Session::ListenForPacket()
{
    m_socket.async_read_some(
        boost::asio::buffer(m_buffer, MAX_BYTE_LENGTH),
        boost::bind(&Session::HandleRead, this, shared_from_this(), boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)
    );
}

void Session::HandleRead(boost::shared_ptr<Session> session, const boost::system::error_code& error, size_t bytes_transferred)
{
    if (!error)
    {
        m_outboundPacket = new char[20];

        m_outboundPacket = "TESTPACKET";

        SendPacket();
    }
}

void Session::SendPacket()
{
    m_socket.async_write_some(
        boost::asio::buffer(m_outboundPacket, 5), // using 5 as an arbitrary amount of bytes to read
        boost::bind(&Session::HandleWrite, this, shared_from_this(), boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)
    ); // CRASHES HERE
}

void Session::HandleWrite(boost::shared_ptr<Session> session, const boost::system::error_code& error, size_t bytes_transferred)
{
    std::cout << *data << std::endl;

    if (!error)
    {
        std::cout << "Packet send successful" << std::endl;
    }
}

Вот декларации переменных-членов

char* m_outboundPacket;
char m_buffer[MAX_BYTE_LENGTH];

Я пытался сохранить данные char* в boost::shared_ptr и передать ptr моей функции HandleWrite, но она тоже не сработала ...

Любые советы о том, как решить эту проблему, будут высоко оценены.

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...