DoubleLi

qq: 517712484 wx: ldbgliet

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  4737 随笔 :: 2 文章 :: 542 评论 :: 1615万 阅读
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

前言

  • socket在默认情况下是阻塞状态的,这就使得发送和接受都处于阻塞状态;
  • TCP协议下发送选用send,UDP协议下,发送选用sendto.
  • TCP协议下接收选用recv,UDP协议下,接收选用recvfrom.

一、阻塞模式&&send

假设发送缓冲区大小为4096KB,其中已经使用4000KB空间,剩余96KB空间;现在又有200KB的数据需要发送,则只能先将96KB的数据放入发送缓冲区但不发送(阻塞),直到缓冲区空出空间足够放入剩余104KB,再send操作将这200子节发送,返回发送成功字节数200;

二、非阻塞&&send

与阻塞不同,非阻塞模式,发送缓冲区得到数据会立即发送,例:当缓冲区只有96KB空间,但要发送200KB数据要进入发送缓冲区,则直接调用send并返回成功字节数96,并不等待将剩余的104字节放入缓冲区同时发送;

三、阻塞/阻塞模式&&sendto

UDP的sendto并不能阻塞发送,因为UDP并没有真正的发送缓冲区,它所做的只是将应用缓冲区拷贝给下层协议栈,在此过程中加上UDP头,IP头,所以实际不存在阻塞。


++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


四、阻塞模式&&recv

将会阻塞到发送缓冲区至少 1 个字节,才返回;
在没有数据到来时,对它们的调用都将处于睡眠状态,不会返回。

五、阻塞模式&& recvfrom

将会阻塞到发送缓冲区至少一个完整的UDP数据报,才返回;
在没有数据到来时,对它们的调用都将处于睡眠状态,不会返回。

六、阻塞模式 / 非阻塞模式&&recv

如果缓冲区 有任何一个字节数据(TCP)或者一个完整UDP数据报,它们将会返回接收到的数据大小。而如果没有任何数据则返回错误 WSAEWOULDBLOCK/E WOULDBLOCK。

posted on   DoubleLi  阅读(2405)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示