boost :: asio полнодуплексная связь

0

Я пишу довольно простой сервер, используя boost :: asio.

Как вы собираетесь настраивать методы boost :: asio async_write() и async_read_some() для случая, когда вы читаете и записываете в сокет самостоятельно?

Большинство примеров boost имеют вызов async_accept(), который привязывается к обработчику, который заканчивает вызов async_write() или async_read(), но не тот и другой.

Теги:
boost
boost-asio

1 ответ

0

Я запускаю только async_read_some() непосредственно после установления соединения. Во время обратного вызова я обрабатываю полученные данные, а затем снова запускаю async_read_some().

Для части записи: я вызываю async_write, как только будет первый пакет данных для записи. Хотя один пакет записан, никакие другие данные не могут быть записаны, поэтому я также использую очередь для записи данных.

Некоторые псевдокоды:

Connection::sendBytes(bytes)
{
  if (!sendInProgress) {
    socket->async_write_some(bytes, onMessageWritten);
    sendInProgress = true;
  }
  else writeQueue.push_back(bytes);
}

Connection::onBytesWritten()
{
  if (writeQueue.size() == 0) {
    sendInProgress = false;
  }
  else { 
    // Here you can theoretically send all left data at once (using vectored IO) or only some of the data.
    // Depending on data size performance will be different.
    socket->async_write_some(writeQueue, onBytesWritten);
    writeQueue.clear();
  }
}

Кроме того, вам понадобится некоторая обработка ошибок и в зависимости от того, кто может вызвать методы записи, также блокируя. Если вы выполняете только вызовы записи из одного потока, который управляет io_service, тогда это намного проще, потому что тогда все чтения и записи происходят в одном потоке (цикл событий), и вы не блокируете. Например, это будет иметь место, если вы вызываете sendBytes в обработчике onBytesReceived.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню