streambuf
中文版 https://zh.cppreference.com/w/cpp/io/basic_streambuf,偶有误差,可参考英文版本纠正。
英文版 https://en.cppreference.com/w/cpp/io/basic_streambuf
类 basic_streambuf 控制字符序列的输入与输出。它包含下列内容并提供到它们的访问:
受控字符序列(The controlled character sequence),也称作 buffer,可包括:input sequence (also called get area) 用于缓冲输入操作;以及 output sequence (also called put area) 用于缓冲输出操作。
关联字符序列,又称作源(对于输入)或池(对于输出)。它可以是通过 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) 中下一位置指针大于起始指针,则回放位置可用,而下一位置指针可以被自减并赋值,以将字符放回到获取区。
asio::streambuf
发送接收缓存asio::buffer及asio::streambuf
https://www.jianshu.com/p/1dd00d469ada
stream
对于输入输出流,虽然频繁在用 cout
/cin
,但也只限于标准输入、输出,只限于正确流程。如果有任何的异常处理,认知为零。
1 | cin >> expected_int; |
流的状态到底在什么情况下会发生改变呢,每一种状态会对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_write
,async_write_some
就有可能先将第二个buffer
的数据先发送出去。服务器可能会接收到完全错乱的数据。
asio 读写接口
异步接口形式比同步接口增加 async_
前缀。
同步接口
类成员函数
1 | socket.send() |
自由函数
1 | write(socket, ...) |