基于TCP下MSG_PEEK的套接字接受缓冲区的排队数据量分析

本文介绍了如何利用MSG_PEEK标志和ioctl的FIONREAD命令来检查TCP套接字的接收缓冲区数据量,避免读操作堵塞,并对比了TCP与UDP的区别。提供客户端和服务器端的核心代码示例。
摘要由CSDN通过智能技术生成

如何获取已经排队的数据量:

(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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值