无缓冲的std streambuf实现

时间:2011-08-18 11:56:43

标签: c++ sockets iostream

对序列化库的一些快速测试我想创建一个可以读/写套接字的streambuf。我不想在streambuf中使用缓冲区,但让socket处理它。我确信序列化lib只会调用std::istream::readstd::ostream::write。快速浏览一下Microsoft的basic_streambuf实现,可以看出这些调用几乎直接转发到xsputnxsgetn

问题是:我可以从streambuf派生并只实现xsputn和xsgetn,并确保使用我的实现的流将始终调用这些方法,而不是同步/ overflow / underflow / pback / ...?或者我应该覆盖同步等以返回错误,还是标准保证默认实现是正常的?这应该适用于任何通用平台,我不能使用boost :: iostreams。

实际上我会使用这样的东西:

class socket_buf : public std::streambuf
{
public:
    //Socket is a class with std::stream-like read/write methods
  MyBuf( Socket& s ) : sock( s ) {}

protected:
  std::streamsize xsputn( const char* s, std::streamsize n )
  {
    return sock.write( s, n );
  }

  std::streamsize xsgetn( char* s, std::streamsize n )
  {
    return sock.read( s, n );
  }

private:
  Socket& sock;
};

1 个答案:

答案 0 :(得分:6)

在没有缓冲区的情况下(几乎没有)实现std::streambuf是不可能的。由于underflow的许多公共接口不会通过overflowstd::streambuf,因此您必须重载xsputnxsgetn。例如。 sputcsbumpc等等。根据内部缓冲区的状态和特定的sputn实现,即使xsputn也不能保证会调用std::streambuf