TCP recv(阻塞模式)函数到底时什么时候返回,结束阻塞的呢?原来是这样

博客探讨了TCP的recv函数在阻塞模式下何时返回的问题。通过分析Linux系统源码,得出在正常情况下,recv函数会在以下三种情况下返回:1) 接收缓冲队列无数据时持续阻塞;2) 从接收缓冲队列中读取数据并填满用户缓冲区,返回已读取的长度;3) 收到部分数据,但接收缓冲队列已空,返回小于请求长度的数据。
摘要由CSDN通过智能技术生成

最近在和同时讨论一个问题,TCP recv函数到底时什么时候返回,结束阻塞的呢?各有各的看法、有的说是检测到窗口为0时返回,有的说是系统内核发出的接收完毕信号,有的说是收到给定的大小结束的.........

一开始我也不确定到底哪个正确,为了追寻正确的答案,去看了下linux 系统源码tcp实现的部分,找到了在接收这块的逻辑,最终确定下来了recv函数的返回时机。

 

recv的返回时机有很多,比如关闭了连接或者出错等都会返回,这些我们都不看,不考虑,只看正常情况下的返回。

 

函数 int recv( _In_ SOCKET s, _Out_ char *buf, _In_ int len, _In_ int flags);

当调用recv(阻塞模式)函数后,正常情况下内部逻辑如下:

情况1. 当检测到接收缓冲队列中没有数据时候,一直循环阻塞

情况2.当检测到接收缓冲队列中有数据,则开始读取数据,写入到用户缓冲buf中,清除掉接收队列中已经读取到的数据,写完队列中的一包再写下一包,直到写入len大小数据,返回。这时队列中可能正好空了,也可能还有数据待下次读取。这时recv返回的大小=len

情况3:当检测到接收缓冲队列中有数据,则开始读取数据,写入到用户缓冲buf中,清除掉接收队列中已经读取到的数据。写完队列中的一包再写下一包,当检测队列一个循环,都没有数据了,但是还没有超过len大小,返回,这时recv返回的大小<len

 

以上是对正

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值