从套接字读取一个字节与多个字节

Mic*_*cio 2 c c++ unix sockets

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

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

这样的阅读会产生什么后果?

缓冲区溢出?

Sha*_*esh 6

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

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

假设这是一个蒸汽套接字(TCP),一次只读取一个字节没有语义上的损害。无论哪种方式,结果都是正确的。这并不是说这是一个好主意。每次调用都read需要切换到内核模式并执行一系列操作。无论您检索一字节的批次,这些成本都相同。因此,从性能角度来看,强烈建议您每次执行更大的读取。

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