我必须从套接字读取未知长度的数据。我需要等待特定的字符序列停止阅读。
一次只读取一个字节是个好主意吗?最大长度为 4096。我知道应该以尽可能大的尺寸实现从套接字读取,但在我的情况下,当最大长度不长时,这是好的解决方案吗?
这样阅读的后果是什么?
缓冲区溢出?
最佳答案
首先,答案很大程度上取决于套接字的类型。
如果这是一个数据报套接字 (UDP),那么答案是响亮的否。仅从数据报套接字中读取一个字节将导致您丢失重要信息。读取的大小应该(至少)对应于发送的大小。
假设这是一个 Steam 套接字 (TCP),一次只读取一个字节没有语义上的危害。无论哪种方式,结果都是正确的。这并不是说这是个好主意。每次调用 read
都需要切换到内核模式并执行一系列操作。无论您是检索一个字节的批处理,这些都同样昂贵。因此,强烈建议您在性能方面每次都执行更大的读取。
您的困境的解决方案是使用缓冲 IO。创建或使用一个预先存在的适配器,该适配器将执行大型 read
以将数据放入用户空间缓冲区,然后您可以从该缓冲区中选择适合您的任何 block 大小的字节最好的。
关于c++ - 从套接字读取一个字节与多个字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37459584/