Boost.Iostreams - Filtering Stream questions (flushing, interactive input)
I've been trying to use Boost.Iostreams, with mixed success. I've got a few more stumbling blocks that hopefully I can get some help with :-). First, I have a socket class, which I've used Boost.Iostreams to create a nice interface for. Quick details: class winsock_device { typedef boost::iostreams::bidirectional_device_tag category; //..implementation.. }; class winsock_socket { typedef winsock_device stream_device_type; typedef boost::iostreams::stream_buffer< stream_device_type > stream_buffer_type; typedef std::iostream stream_type; stream_device_type m_stream_device; stream_buffer_type m_stream_buffer; stream_type m_stream; public: winsock_socket( SOCKET raw_socket ) : m_stream_device( raw_socket ) , m_stream_buffer( m_stream_device ) , m_stream( & m_stream_buffer ) {} stream_type & stream() { return m_stream; } //..more implementation.. }; The implementation seems to work, tests show it to be working fine for input and output (with output needing to be flushed). Only problem is that the newlines are mismatched - a simple telnet chat client gets supurflous \r characters using std::getline, so I decided to wrap around the stream using a boost::iostreams::filtering_stream< boost::iostreams::bidirectional >, which is where things fall apart. I took my simple example, and replaced: std::iostream & ios = socket->stream(); with: namespace bios = boost::iostreams; bios::filtering_stream< bios::bidirectional > ios; ios.push( socket->stream() ); both with the same testing code: std::string nickname; ios << "Welcome, user - please enter a nickname:\n" << std::flush; socket->stream().flush(); std::getline( ios , nickname ); ios << "Welcome, " << nickname << "\n"; ios << "*** actual chatting not yet implemented ***\n"; ios << "Disconnecting you now, bye " << nickname << " !!!\n" << std::flush; socket->stream().flush(); This failed to work at all at first, eventually I figured out I needed to flush first the ios stream, and then the underlying socket->stream. This brings me to: question 1: Is there a workaround to allow an ending stream of (std::iostream &) to be flushed automatically by flushing filtering_stream? Even with no filters installed, however, the program freezes (until I shut down the telnet client) when I attempt to read a line from the stream, even after entering multiple newlines - I'm not exactly sure what's happening here. This brings me to: question 2: How can I get the input moving through my stream? Do I need to start a seperate thread to constantly flush() the stream that the main thread is blocked on i/o for? Thanks, -Mike
participants (1)
-
Michael Rickert