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



相对简单的问题:当使用Linux非阻塞套接字执行recv()时,是否有一种方法可以先验地确定可以接收多少数据?

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

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

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

但是有一个更简单的方法—您可以调用recv(),它返回实际读取的字节数。只有当实际读取的字节数与请求的缓冲区大小相同时,才需要重复调用。即使您不重复调用,下一个select()调用也会返回是否还有更多可用的数据可供读取。

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

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

此方法将导致额外的系统调用,直到应用程序在套接字缓冲区中满足所需的字节数为止。此外,也不能保证在实际将数据读入应用程序时,会有更多的字节到达。

最新更新