streambuf

streambuf

中文版 https://zh.cppreference.com/w/cpp/io/basic_streambuf,偶有误差,可参考英文版本纠正。

英文版 https://en.cppreference.com/w/cpp/io/basic_streambuf

类 basic_streambuf 控制字符序列的输入与输出。它包含下列内容并提供到它们的访问:

  1. 受控字符序列(The controlled character sequence),也称作 buffer,可包括:input sequence (also called get area) 用于缓冲输入操作;以及 output sequence (also called put area) 用于缓冲输出操作。

  2. 关联字符序列,又称作源(对于输入)或池(对于输出)。它可以是通过 OS API 访问的实体(文件、 TCP 接头、串行端口、其他字符设备),或者可以是能转译成字符源或池的对象( std::vector 、数组、字符串字面量)

受控制序列中的字符表示和编码可以异于关联序列中的字符表示,该情况下典型地用 std::codecvt 本地环境进行转换。常见的例子是通过 std::wfstream 对象访问 UTF-8 (或其他多字节编码)文件:受控制字符序列由 wchar_t 字符组成,但关联序列由字节组成。

A basic_streambuf object may support input (in which case the buffer described by the beginning, next, and end pointers is called get area), output (put area), or input and output simultaneously.

basic_streambuf 对象可支持输入(该情况下起始、下一位置和终止指针所描述的区域被称为获取区)、输出(放置区),或同时输入与输出。

If the next pointer is less than the end pointer in the put area, a write position is available. The next pointer can be dereferenced and assigned to.

获取区 放置区(output sequence) 中下一位置指针小于终止指针,则写位置可用。下一位置指针可被解引用和赋值。写入,参考 cout 用来输出。

If the next pointer is less than the end pointer in the get area, a read position is available. The next pointer can be dereferenced and read from.

放置区 获取区(input sequence) 中下一位置指针小于终止指针,则读位置可用。下一位置指针可被解引用和读取。读出,参考 cin 用来写入。

If the next pointer is greater than the beginning pointer in a get area, a putback position is available, and the next pointer may be decremented, dereferenced, and assigned to, in order to put a character back into the get area.

获取区(input sequence) 中下一位置指针大于起始指针,则回放位置可用,而下一位置指针可以被自减并赋值,以将字符放回到获取区。

c++ 流对象之 streambuf

asio::streambuf

发送接收缓存asio::buffer及asio::streambuf

https://www.jianshu.com/p/1dd00d469ada

stream

对于输入输出流,虽然频繁在用 cout/cin,但也只限于标准输入、输出,只限于正确流程。如果有任何的异常处理,认知为零。

1
2
3
4
5
6
7
8
9
cin >> expected_int;
// 如果输入为字母等非数值,后续 cin 就不能用了
assert(cin.good()); // false
assert(cin.bad()); // false

istream is;
// 从空的输入流中做格式化输入,会发生错误
is >> something;
assert(is.good()); // false

深入理解C++输入输出流

流的状态到底在什么情况下会发生改变呢,每一种状态会对io流操作产生什么影响呢?这或许是我对流的状态这个知识点的疑问。

——不能同意更多

因为 IO 流出现在 C++ 引入异常之前,所以错误处理方式仍是像 C 那样去检查错误码或者状态等来判断。

流发生错误,需要手动查看其状态才能知道,这是早起 c++ 不支持异常导致的。为了兼容,一致沿用。
为了统一使用异常来处理错误,可以使用流的 exception 函数 来设置当发生了指定流状态的时候触发异常。

——似乎流的异常并不好用。抽空验证~

asio::async_write 有坑

https://blog.csdn.net/cedricporter/article/details/6915775

async_write 是通过一次或者多次调用 async_write_some 函数来实现的,那么如果在第一个 async_write 还没有完成就调用第二个 async_writeasync_write_some 就有可能先将第二个 buffer 的数据先发送出去。

服务器可能会接收到完全错乱的数据。

asio 读写接口

异步接口形式比同步接口增加 async_ 前缀。

同步接口

类成员函数

1
2
3
4
5
socket.send()
socket.receive()

socket.write_some()
socket.read_some()

自由函数

1
2
write(socket, ...)
read (socket, ...)

https://www.cnblogs.com/qicosmos/p/3487169.html