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