Linux非阻塞套接字:在阻塞之前可以读取多少数据?

时间:2016-10-12 01:34:20

标签: linux sockets nonblocking

相对简单的问题:当使用Linux非阻塞套接字执行recv()时,有没有办法确定可以接收多少数据?

似乎我总是最终会做一个额外的recv()调用,以确定我已经耗尽了所有数据。

2 个答案:

答案 0 :(得分:2)

您可以使用ioctl()FIONREAD来获取套接字缓冲区中未读字节的数量。

然而,这也是双系统调用,并且在调用recv()之前仍然无法保证没有更多数据到达。

但是有一种更简单的方法 - 你可以调用recv()并返回实际读取的字节数。如果实际读取的字节数与请求的缓冲区大小相同,则只需重复调用。即使您不重复呼叫,下一次select()呼叫也将返回是否还有更多数据可供阅读。

答案 1 :(得分:0)

您可以使用recv中的MSG_PEEK标志来确定要从套接字缓冲区读取的当前字节数。如果应用程序在处理数据之前等待确定的字节数,则可以依赖MSG_PEEK。数据不会从套接字缓冲区中删除。但如果您在没有ret的情况下阅读,MSG_PEEK将是相同的值。

ret = recv(sd, buf, MAX_CALL_DATA_SIZE, MSG_PEEK);

此方法会导致额外的系统调用,直到应用程序需要的字节数在套接字缓冲区中。此外,当您实际将数据读入应用程序时,无法保证会有更多字节到达。