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