sti*_*ijn 4 c++ sockets iostream
为了快速测试一个序列化库,我想创建一个可以读/写套接字的streambuf.我不想在streambuf中使用缓冲区,但让socket处理它.我确信序列化lib只会调用std::istream::read和std::ostream::write.快速浏览一下Microsoft的basic_streambuf实现,可以看出这些调用实际上是直接转发给xsputn和xsgetn.
问题是:我可以从streambuf派生并只实现xsputn和xsgetn,并确保使用我的实现的流将始终调用这些方法,而不是sync/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;
};
Run Code Online (Sandbox Code Playgroud)
在std::streambuf没有缓冲区的情况下实现(几乎?)是不可能的.你将不得不重载underflow,overflow因为许多公共接口std::streambuf不会通过xsputn或xsgetn.例如sputc,sbumpc甚至sputn不保证xsputn根据内部缓冲区的状态和特定std::streambuf实现来引起调用.
| 归档时间: |
|
| 查看次数: |
1880 次 |
| 最近记录: |