我找不到这个问题的答案:如果我从套接字4bytes(我设置4字节的限制)读取会发生什么,但实际上有256字节等待读取?它们会丢失还是会等到下一次读取函数调用?
答案 0 :(得分:6)
如果是TCP套接字,则不会丢失任何数据;它会排队等候。
请记住,您必须准备好处理部分读取,即您获得的字节数少于请求的数量,并且必须再次调用read()
才能获得更多。
答案 1 :(得分:3)
这取决于您使用的是哪种插座。如果是流套接字(使用SOCK_STREAM创建),则它支持数据流,您甚至可以通过1个字节读取它(虽然效率不高),另一方面,您可以请求1024个字节,但只能获得1个字节。这几乎与发件人将它们分成流的部分无关(有依赖性,但你不应该依赖它)。因此,对于流,您需要通过更高级别的协议来定义数据结束。您可以在末尾发送带有\ n的字符串,或者使用零终止字符串,或者在该数据之前发送一些字节大小的即将到来的数据。
另一方面,如果您使用数据报协议(使用SOCK_DGRAM创建),您将通过数据包获取数据 - 无论发送者发送的是什么大小。如果您提供的缓冲区小于可用数据,则会将其截断,并丢弃剩余数据。