Структура программы для двунаправленной TCP-связи с использованием Boost :: Asio

Во-первых, я надеюсь, что мой вопрос имеет смысл и даже возможен! Из того, что я читал о сокетах TCP и Boost :: ASIO, я думаю, что так и должно быть.

Я пытаюсь настроить две машины и установить между ними работающую двунаправленную связь чтения / записи по TCP. Любая из сторон должна иметь возможность отправлять некоторые данные для использования другой стороной.

Первое, что сбивает с толку TCP (/ IP?), - это то, что он требует этой модели клиент / сервер. Однако чтение показывает, что любая из сторон может писать или читать, поэтому я еще не полностью разочарован. Я не возражаю против того, чтобы одна сторона была клиентом, а другая - сервером. В моем приложении об этом можно договориться заранее, и меня это не беспокоит.

К сожалению, все примеры, с которыми я сталкиваюсь, похоже, сосредоточены на подключении клиента к серверу, и сервер немедленно отправляет некоторый бит данные обратно. Но я хочу, чтобы клиент также мог писать на сервер.

Я представляю себе какой-то цикл, в котором я вызываю io_service.poll () . Если опрос показывает, что другая сторона ожидает отправки некоторых данных, она вызовет read () и примет эти данные. Если в очереди нет ничего ожидающего и у нее есть данные для отправки, она вызовет write () . Когда обе стороны делают это, они должны иметь возможность читать и писать друг другу.

Меня беспокоит, как избежать ситуаций, в которых оба одновременно выполняют какую-либо синхронную операцию write (). У них обоих есть данные для отправки, а затем они сидят и ждут, чтобы отправить их с обеих сторон. Означает ли эта проблема, что я должен выполнять только асинхронные write () и read () ? В таком случае что-нибудь взорвется, если обе стороны соединения попытаются одновременно писать асинхронно?

Я надеюсь, что кто-то сможет идеально:

1) Обеспечить структуру очень высокого уровня или наилучшая практика подход, который может выполнить эту задачу как с точки зрения клиента, так и с точки зрения сервера

или, в несколько менее идеальном случае,

2) Скажите, что то, что я пытаюсь сделать, невозможно, и, возможно, предложите какое-то обходное решение .

12
задан Sam Miller 24 June 2011 в 00:18
поделиться