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

时间:2014-11-29 18:30:32

标签: c++ c sockets client-server

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

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

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

3 个答案:

答案 0 :(得分:2)

您可能使用TCP(流媒体协议) - 不发送消息边界,只发送字节流。因此,即使服务器执行单次写操作,您最终也可能需要执行多次读取才能获取数据。

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

如果读取得到N个字节,并且还不够,则需要发出另一个读取目标缓冲区+ N.

答案 1 :(得分:1)

请阅读read

截至

  

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

好吧,读取会覆盖buff但不会为你填充空缓冲区,你必须自己动手。

答案 2 :(得分:0)

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