流、短读取和短写入
在Boost.Asio中,许多I/O对象是面向流的。这意味着:
没有消息边界:传输的数据是连续的字节序列。
读取或写入操作可能传输的字节数少于请求的字节数:这称为短读取或短写入。
提供面向流I/O的对象通常满足以下一种或多种类型要求:
SyncReadStream:通过名为
read_some()的成员函数执行同步读取操作。AsyncReadStream:通过名为
async_read_some()的成员函数执行异步读取操作。SyncWriteStream:通过名为
write_some()的成员函数执行同步写入操作。AsyncWriteStream:通过名为
async_write_some()的成员函数执行异步写入操作。
面向流的I/O对象的示例包括ip::tcp::socket、ssl::stream<>、posix::stream_descriptor、windows::stream_handle等。
程序通常希望传输确切数量的字节。当发生短读取或短写入时,程序必须重新启动操作,并持续执行,直到传输了所需的字节数。Boost.Asio提供了自动执行此操作的通用函数:read()、async_read()、write()和async_write()。
EOF为何是错误
流的结束可能导致read、async_read、read_until或async_read_until函数违反其约定。例如,读取N字节可能因EOF而提前结束。EOF错误可用于区分流的结束和成功读取大小为0的情况。
Last updated