C/C++ 中的 Read() - 关于读取与缓冲区大小

Read() in C/C++ - regarding what is read vs buffer size

本文关键字:读取 缓冲区 于读取 C++ 中的 Read      更新时间:2023-10-16

我正在尝试从服务器读取消息(字符串/文本),并且我将缓冲区大小设置得非常大(buffer_size = 1000),以便我只需要从服务器读取一次。

所以我的问题是,如果消息正好是 10 个字节,并且我调用 read(socket、buffer、buffer_size),那么它是否只会读取 10 个字节,因为它小于实际缓冲区大小?我想我只是对调用的行为感到好奇,以防读取的内容实际上不如预期

另外,如果我再次调用 read(),它会覆盖缓冲区中的内容吗?我的意思是清空缓冲区并用新输入覆盖它。

您可能使用的是TCP,这是一种流式处理协议 - 不发送消息边界,仅发送字节流。因此,即使服务器执行单次写入,您最终也可能需要执行多次读取才能获取数据。

继续读取,直到有足够的字节,或者读取返回 0(这意味着 EOF)。

如果读取获得 N 个字节,但这还不够,那么您需要发出另一个读取目标缓冲区 + N。

請閱讀 man of read

截至

另外,如果我再次调用 read(),它会覆盖缓冲区中的内容吗?我的意思是清空缓冲区并用新输入覆盖它。

好吧,读取将覆盖buff,但不会为您进入空缓冲区,您必须自己做。

read(int fd, void *buffer, size_t count) 函数将从文件描述符fd读取多达 count 个字节到 buffer 中,因此如果只有10 bytes用于读取,则只会读取10 bytes。不,它不会清空buffer并覆盖其内容,它只会覆盖从文件描述符读取的字节。