Boost logo

Boost Users :

From: Michael Rickert (pandamojo_at_[hidden])
Date: 2005-11-15 22:59:26


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



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net