Во-первых, я надеюсь, что мой вопрос имеет смысл и даже возможен! Из того, что я читал о сокетах TCP и Boost :: ASIO, я думаю, что так и должно быть.
Я пытаюсь настроить две машины и установить между ними работающую двунаправленную связь чтения / записи по TCP. Любая из сторон должна иметь возможность отправлять некоторые данные для использования другой стороной.
Первое, что сбивает с толку TCP (/ IP?), - это то, что он требует этой модели клиент / сервер. Однако чтение показывает, что любая из сторон может писать или читать, поэтому я еще не полностью разочарован. Я не возражаю против того, чтобы одна сторона была клиентом, а другая - сервером. В моем приложении об этом можно договориться заранее, и меня это не беспокоит.
К сожалению, все примеры, с которыми я сталкиваюсь, похоже, сосредоточены на подключении клиента к серверу, и сервер немедленно отправляет некоторый бит данные обратно. Но я хочу, чтобы клиент также мог писать на сервер.
Я представляю себе какой-то цикл, в котором я вызываю io_service.poll ()
. Если опрос показывает, что другая сторона ожидает отправки некоторых данных, она вызовет read ()
и примет эти данные. Если в очереди нет ничего ожидающего и у нее есть данные для отправки, она вызовет write ()
. Когда обе стороны делают это, они должны иметь возможность читать и писать друг другу.
Меня беспокоит, как избежать ситуаций, в которых оба одновременно выполняют какую-либо синхронную операцию write (). У них обоих есть данные для отправки, а затем они сидят и ждут, чтобы отправить их с обеих сторон. Означает ли эта проблема, что я должен выполнять только асинхронные write ()
и read ()
? В таком случае что-нибудь взорвется, если обе стороны соединения попытаются одновременно писать асинхронно?
Я надеюсь, что кто-то сможет идеально:
1) Обеспечить структуру очень высокого уровня или наилучшая практика подход, который может выполнить эту задачу как с точки зрения клиента, так и с точки зрения сервера
или, в несколько менее идеальном случае,
2) Скажите, что то, что я пытаюсь сделать, невозможно, и, возможно, предложите какое-то обходное решение .