Правильный способ прочитать и записать данные для Boost :: Beast :: WebSocket :: StreamC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Правильный способ прочитать и записать данные для Boost :: Beast :: WebSocket :: Stream

Сообщение Anonymous »

Когда мы записываем данные в простой сокет или SSL :: Stream , рекомендуется использовать очередь сообщений для отправки данных. В этом случае я сохраняю сообщения в очереди типа std :: queue и, как правило, использую следующую реализацию:

Код: Выделить всё

template
class io : public std::enable_shared_from_this
{
public:
io(socket_t socket) : m_socket(std::move(socket)) {}

void start()
{
read();
}

void write(std::string data)
{
bool write_in_progress = !m_write_queue.empty();
m_write_queue.push(std::move(data));
if (!write_in_progress)
{
do_write();
}
}

void close()
{
m_socket.close();
}

private:
socket_t m_socket;
std::array m_buffer;
std::queue m_write_queue;

void read()
{
auto self = this->shared_from_this();

m_socket.async_read_some(boost::asio::buffer(m_buffer),
[this, self](boost::system::error_code ec, std::size_t bytes_transferred)
{
if (!ec)
{
std::string data(m_buffer.data(), bytes_transferred);
read();
}
});
}

void do_write()
{
auto self = this->shared_from_this();

boost::asio::async_write(m_socket, boost::asio::buffer(m_write_queue.front().c_str(), m_write_queue.front().size()),
[this, self](boost::system::error_code ec, std::size_t /*length*/)
{
if (!ec)
{
m_write_queue.pop();
if (!m_write_queue.empty())
{
do_write();
}
}
});
}
};
Мой вопрос: как написать данные для Boost :: Beast :: WebSocket :: Stream Асинхронно? Должен ли я создать очередь, в которой каждый элемент Boost :: Beast :: flat_buffer или сделать это другим? Boost :: Beast :: WebSocket :: Stream . Я думаю, для чтения мне нужно использовать Boost :: Beast :: FLAT_BUFFER . Однако я не знаю, нужно ли мне очистить этот буфер после каждой операции чтения, если этот буфер является полем класса?

Подробнее здесь: https://stackoverflow.com/questions/796 ... cketstream
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»