相对简单的问题:当使用Linux非阻塞套接字执行recv()时,有没有办法确定可以接收多少数据?
似乎我总是最终会做一个额外的recv()调用,以确定我已经耗尽了所有数据。
答案 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);
此方法会导致额外的系统调用,直到应用程序需要的字节数在套接字缓冲区中。此外,当您实际将数据读入应用程序时,无法保证会有更多字节到达。