1

我找不到这个答案:如果我从套接字读取 4 字节(我设置了 4 字节的限制)但实际上有 256 字节等待读取会发生什么?他们会丢失还是会等到下一次调用 read 函数?

4

2 回答 2

6

如果是 TCP 套接字,则不会丢失任何数据;它会排队。

请记住,您必须准备好处理部分读取,即您获得的字节数少于请求的字节数,并且必须read()再次调用才能获得更多。

于 2013-03-02T20:34:04.017 回答
3

这取决于您使用哪种插座。如果是流套接字(使用 SOCK_STREAM 创建),那么它支持数据流,你甚至可以读取 1 个字节(虽然效率不高),另一方面你可能请求 1024 个字节但只能得到 1 个字节。这几乎与发送者将它们放入流中的部分无关(存在依赖性,但您不应该依赖它)。因此,对于流,您需要通过更高级别的协议定义数据的结尾。您可以在末尾发送带有 \n 的字符串,或者使用以零结尾的字符串,或者在该数据之前发送一些字节大小的即将到来的数据。
另一方面,如果您使用数据报协议(使用 SOCK_DGRAM 创建),您将通过数据包获取数据 - 无论发送者发送它们的大小。如果您提供的缓冲区小于可用数据,它将被截断并丢弃剩余的数据。

于 2013-03-02T21:18:00.250 回答