c++ - 从套接字读取一个字节与多个字节

标签 c++ c sockets unix

我必须从套接字读取未知长度的数据。我需要等待特定的字符序列停止阅读。

一次只读取一个字节是个好主意吗?最大长度为 4096。我知道应该以尽可能大的尺寸实现从套接字读取,但在我的情况下,当最大长度不长时,这是好的解决方案吗?

这样阅读的后果是什么?

缓冲区溢出?

最佳答案

首先,答案很大程度上取决于套接字的类型。

如果这是一个数据报套接字 (UDP),那么答案是响亮的。仅从数据报套接字中读取一个字节将导致您丢失重要信息。读取的大小应该(至少)对应于发送的大小。

假设这是一个 Steam 套接字 (TCP),一次只读取一个字节没有语义上的危害。无论哪种方式,结果都是正确的。这并不是说这是个好主意。每次调用 read 都需要切换到内核模式并执行一系列操作。无论您是检索一个字节的批处理,这些都同样昂贵。因此,强烈建议您在性能方面每次都执行更大的读取。

您的困境的解决方案是使用缓冲 IO。创建或使用一个预先存在的适配器,该适配器将执行大型 read 以将数据放入用户空间缓冲区,然后您可以从该缓冲区中选择适合您的任何 block 大小的字节最好的。

关于c++ - 从套接字读取一个字节与多个字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37459584/

相关文章:

c++ - Xcode 不显示控制台输出;你如何冲洗控制台?

c - 使用 fgets 读取文件时出现段错误

c - 通过套接字发送图像的最佳方法?

c - C 有任何内置函数吗?

java - 从 Android 通过套接字发送缓冲数据

sockets - 如何在 ubuntu 12.04 中查找端口号?

c++ - 过剩和 glew 的突然问题包括和类型说明符

c++ - Xml 解析器 - 字符串::查找

c++ - 生成随机长度的随机数字串

c++ - 监听时出现 Winsock 错误 10022