Давайте решим все 3 вопроса здесь:
Создание iostream на стороне клиента сокета .
Это действительно просто:
boost::asio::ip::tcp::iostream socketStream;
socketStream.connect( hostname, std::to_string( port ) );
Вы должны проверить состояние потока, чтобы увидеть, успешно ли он подключен.
Создание iostream на стороне сервера сокетов .
Предположим, у вас есть объект-акцептор, и он связан и слушает ..
boost::asio::ip::tcp::iostream connectionSocketStream; // from the connection object
acceptor.accept( *connectionSocketStream.rdbuf() );
// или
acceptor.async_accept( *connectionSocketStream.rdbuf(), callback );
где обратный вызов - это функция, которая принимает код ошибки.
Потоковые объекты
Теперь для самой потоковой передачи, и здесь ваша проблема заключается в том, что при потоковой передаче строки «Message» клиентская сторона должна знать, где начинается и заканчивается это сообщение, и обычный iostream не будет писать ничего, чтобы указать это. Это недостаток самого iostream.
Поэтому ответом является использование буст-архива, и вы можете использовать текстовый или бинарный архив, если вы используете одни и те же оба конца. Даже не имеет значения, использует ли одна сторона 64-битный байтовый код, а другая - 32-битный байтовый или другой микс.
Используя бинарный архив, вы отправите сообщение следующим образом:
boost::archive::binary_oarchive oarch( socketStream, boost::archive::no_header );
oarch << "Message";
Не забудьте очистить поток (socketStream, а не oarch) после завершения отправки всего, что вы хотите отправить на этом этапе.
и получите сообщение
boost::archive::binary_iarchive iarch( socketStream, boost::archive::no_header );
iarch >> message;
Вы могли бы создать один архив и использовать его повсюду, особенно для исходящих сообщений. При входящем входе у вас могут возникнуть проблемы, если вы получите сообщение об ошибке потоковой передачи, так как это сломает ваш архив.
Вы можете использовать текстовый архив вместо бинарного.
В архиве надстройки автоматически будет указана информация заголовка, чтобы он знал, когда объект завершен, и вернется к вам только после того, как у него будет завершенный объект или что-то сломалось.
Примечание: примитивные типы, например, std :: string и даже vector и т. Д., Автоматически обрабатываются архивом. Ваши собственные классы будут нуждаться в специальных перегрузках относительно того, как их передавать. Вам следует прочитать документацию boost :: archive.
Примечание. Вы можете подключить объект архива к потоку до его открытия. Архив работает вокруг объекта streambuf, который не изменяется в зависимости от успешного открытия потока.
Создание без no_header было бы проблемой, хотя архивы сразу пытаются использовать поток при построении (для чтения или записи своего заголовка)