c++ - basic_streambuf::setbuf 应该设置哪个缓冲区?

标签 c++ io winsock streambuf

我正在开发一个 basic_streambuf 来处理从/到 Winsock 套接字的读取和写入。就像 basic_filebuf 一样,我在内部使用 std::codecvt 对象将从底层套接字读取的字节转换为“socket streambuf”的 char 类型,以及将写入套接字 streambuf 的字符转换为可以写入底层套接字的字节。为此,我发现我需要为 streambuf 的读取和写入功能维护缓冲区。

我遇到的逻辑问题是,streambuf 实现旨在用于读取和写入(std::iostream constructor 采用单个指向 streambuf 的指针),但只有一个可重写的成员函数可以为设置底层字符缓冲区而定制:setbuf .如果我想让我的套接字流缓冲区模板的用户设置底层缓冲区,setbuf 应该设置读取缓冲区还是写入缓冲区?哪个选项更有意义?

最佳答案

std::iostream继承自 std::istreamstd::ostream , 但那些实际上都继承自 std::ios ,其中包含缓冲区。因为它们实际上都继承自 std::ios , 只有一个 std::ios std::iostream 基地,因此只有一个内部缓冲区。

摘自 C++2011 年 2 月 11 日草案:

§ 27.6.3

The class template basic_streambuf serves as an abstract base class for deriving various stream buffers whose objects each control two character sequences:
— a character input sequence;
— a character output sequence.

§ 27.7.2

namespace std {  
template <class charT, class traits = char_traits<charT> >  
class basic_istream : virtual public basic_ios<charT,traits> {

§ 27.7.3

namespace std {  
template <class charT, class traits = char_traits<charT> >  
class basic_ostream : virtual public basic_ios<charT,traits> {

关于c++ - basic_streambuf::setbuf 应该设置哪个缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8144347/

相关文章:

c++ - 网络和消息

c++ - vector 迭代器和模板函数

c++ - 为什么成员类型需要前向声明,而成员函数不需要?

sockets - delphi中netcat之类的监听程序不回传命令

c++ - 如何在 Ubuntu 上提高我的程序磁盘读取速度?

java - 文件未正确读取 - 数据 I/O 流

windows - Winsock Kernel的 "WskSendTo"函数在Win7 SP1上导致 "DRIVER_IRQL_NOT_LESS_OR_EQUAL"BSOD

c++ - C++文件的时间戳

c++ - 'ClassName' 和 'ClassInstance' 未在此范围内声明

haskell - Haskell IO 的 MonadPlus 定义