2013-03-02 71 views
1

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

回答

3

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

6

如果它是一个TCP套接字,那么没有数据会丢失;它会排队。

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

+0

我意识到这一点。然而,我所关心的是相反的情况:读数少于可用数量。 – nme 2013-03-02 23:44:31