如何获取已经排队的数据量:
(1)、获取套接字当中的数据量的目的是为了避免读操作而堵塞在内核中(这样会堵塞整个程序的进行), 为了解决这个问题, 我们可以使用非堵塞IO
(2)、在recv、recvfrom、recvnsg函数当中的flags参数标志,我们可以使用MSG_PEEK标志,仅仅读取该套接字当中缓冲区当中的数据量,但是并不真真的读取该数据,也可以使用MSG_DONTWAIT | MSG_PEEK相结合。但是我们需要注意的是,(针对tcp)可能两次调用recv函数返回的值不同,因为两次调用函数之间可能会数据到来。就针对UDP套接字而言,前一次调用recvfrom函数加上MSG_PEEK标志查看接收对列的数据量,后一次不加该标志调用recvfrom函数读取数据,那么两次的返回值(数据报大小、内容、发报者地址)将会是完全相同。
(3)、一些支持ioctl的FIONREAD命令。改命令第三个值-结果参数也会指向某个整数的一个指针,内核通过该整数返回的值就是套接字接收对列里面当前所有数据的字节数;而对于UDP而言,就是所有的已排队数据报的总和的字节数大小。因为针对UDP中返回值包括Ip地址和端口号(IPv4是16字节,IPv6是24字节)。
TCP连接的条件下 代码如下
客户端核心代码片段如下:
#include "unp.h"
void str_cli(FILE *fp, int sockfd)
{
int maxfdp, std