socket的阻塞非阻塞方法在缓冲区的差别
转载:http://blog.csdn.net/jwybobo2007/article/details/6164362
一.发送选用send(这里特指TCP)以及sendto(这里特指UDP)来描述
首先需要说明的是,不管阻塞还是非阻塞,在发送时都会将数据从应用缓冲区拷贝到内核缓冲区(SO_RCVBUF选项声明,除非缓冲区大小为0)。
在阻塞模式下send操作将会等待所有数据均被拷贝到发送缓冲区后才会返回。
如果当前发送缓冲总大小为8192,已经拷贝到缓冲的数据为8000,那剩余的大小为192,现在需要发送2000字节数据,那阻塞发送就会等待缓冲区足够把所有2000字节数据拷贝进去,如第一次拷贝进192字节,当缓冲区成功发送出1808字节后,再把应用缓冲区剩余的1808字节拷贝到内核缓冲,而后send操作返回成功发送字节数。
从上面的过程不难看出,阻塞的send操作返回的发送大小,必然是你参数中的发送长度的大小。
在非阻塞模式下send操作调用会立即返回。
关于立即返回大家都不会有异议。还是拿阻塞send的那个例子来看,当缓冲区只有192字节,但是却需要发送2000字节时,此时调用立即返回,并得到返回值为192。从中可以看到,非阻塞send仅仅是尽自己的能力向缓冲区拷贝尽可能多的数据,因此在非阻塞下send才有可能返回比你参数中的发送长度小的值。
如果缓冲区没有任何空间时呢?这时肯定也是立即返回,但是你会得到WSAEWOULDBLOCK/E WOULDBLOCK 的错误,此时表示你无法拷贝任何数据到缓冲区,你最好休息一下再尝试发送。
在阻塞模式下的sendto操作不会阻塞。
关于这一点的原因在于:UDP并没有真正的发送缓冲区,它所做的只是将应用缓冲区拷贝给下层协议栈,在此过程中加上UDP头,IP头,所以实际不存在阻塞。
在非阻塞模式下sendto操作 不会阻塞(与阻塞一致,不作说明)。
二.接收选用recv(这里特指TCP)以及recvfrom(这里特指UDP)来描述
在阻塞模式下recv,recvfrom操作将会阻塞 到缓冲区里有至少一个字节(TCP)或者一个完整UDP数据报才返回。
在没有数据到来时,对它们的调用都将处于睡眠状态,不会返回。
在非阻塞模式下recv,recvfrom操作将会立即返回。
如果缓冲区有任何一个字节数据(TCP)或者一个完整UDP数据报,它们将会返回接收到的数据大小。而如果没有任何数据则返回错误WSAEWOULDBLOCK/E WOULDBLOCK。
转载于:https://blog.51cto.com/leeyingxj/1299721
socket的阻塞非阻塞方法在缓冲区的差别相关推荐
- python3socket非阻塞在linux里无效_Linux下socket设置为非阻塞方式和fcntl系统调用
用以下方法将socket设置为非阻塞方式 int flags = fcntl(socket, F_GETFL, 0); fcntl(socket, F_SETFL, flags | O_NONBLOC ...
- linux下阻塞的系统调用,Linux下socket设置为非阻塞方式和fcntl系统调用.pdf
Linux 下 socket 设置为非阻塞方式和 fcntl 系统调用 [ 日期: 2011-04-16] 来源: Linux 社区 作者: Linux 用以下方法将 socket 设置为非阻塞方式 ...
- 将socket设置为非阻塞(non-blocking) - 艾子的日志 - 网易博客
将socket设置为非阻塞(non-blocking) - 艾子的日志 - 网易博客 将socket设置为非阻塞(non-blocking) 2011-02-17 22:36:51| 分类: 默认分 ...
- java socket 阻塞模式_(四) 如何将socket设置为非阻塞模式
1. windows平台上无论利用socket()函数还是WSASocket()函数创建的socket都是阻塞模式的: SOCKET WSAAPI socket( _In_ int af, ...
- Socket 同步/异步 与阻塞/非阻塞区别
2019独角兽企业重金招聘Python工程师标准>>> 在网上看了很多答案,也没找到合适的,也许本文也不是合适答案:) 同步和异步关注的是消息通信机制,而阻塞非阻塞关注的是程序在等待 ...
- 确定不来了解一下什么是 BIO NIO AIO 阻塞 非阻塞 同步 异步?
本文内容涉及同步与异步, 阻塞与非阻塞, BIO.NIO.AIO等概念, 这块内容本身比较复杂, 很难用三言两语说明白. 而书上的定义更不容易理解是什么意思. 下面跟着我一起解开它们神秘的面纱. BI ...
- 阻塞/非阻塞/同步/异步方法和多线程的关系?没有任何关系,俩不挨着
1.阻塞非阻塞异步同步是针对方法说的,是评判一个方法运行状态的.和多线程完全两个级别. 2.阻塞非阻塞异步同步是针对方法说的,是评判一个方法运行状态的.和多线程完全两个级别. 3.阻塞非阻塞异步同步是 ...
- 同步异步,阻塞非阻塞,进程间通信
文章目录 同步(synchronous),异步(asynchronous) 阻塞(blocking),非阻塞(non-blocking)(这里指系统的io操作) 进程,线程, 一 二 进程间通信的方式 ...
- 同步异步与阻塞非阻塞的区别 (不定时更新)
同步异步与阻塞非阻塞的概念对于很多初学者来说是一个模糊的概念,其实我们的生活中存在着很多同步和异步的例子. 同步和异步关注的是消息通信机制 在计算机领域,同步就是指一个进程在执行某个请求的时候,若该请 ...
- 怎样理解阻塞非阻塞与同步异步的区别
怎样理解阻塞非阻塞与同步异步的区别? 发现很多人对这两个概念往往混为一谈 6 条评论 分享 按投票排序 按时间排序 47 个回答 605赞同 反对,不会显示你的姓名 卢毅 ,Lyft full-sta ...
最新文章
- python 非_Python函数的非固定参数
- 记 thoughtworks 的一次面试
- 【建议收藏】centos更新yum源为阿里云
- MySQL Binlog Mixed模式记录成Row格式
- STM8L芯片启动时钟分频问题及发现(转)
- 【PHP】月末・月初の出力方法
- 基于IBM Cognos的高级报表制作技巧
- 常见问题及解决方案(后端篇)
- xk01与mk01的区别
- GO语言学习之路10
- java 水仙花数问题(java50道经典编程题)
- 【性能测试】性能测试中问题反思和心得
- Data URL和图片
- Golang FORM相关字段理解
- 迁移过程中出现报错:无法解析的成员访问表达式[USERENV]
- 以太网物理层信号测试与分析
- Activity启动流程源码分析-浅析生命周期函数
- ncbi查找目的基因序列_如何获得基因序列——在NCBI中查找目的基因实例.PDF
- 哔哩大学计算机学院:初识常量变量学习笔记
- 用户需知:ComingChat的现在和未来——深度解析
热门文章
- Office 2010的贴心功能:迷你翻译器
- Swift3.0语言教程使用URL字符串
- Visual Studio提示Bonjour backend初始化失败
- Xamarin.Forms教程开发的Xcode的下载安装
- ​网页图表Highcharts实践教程之图表代码构成
- 标记三维点_三维扫描仪对汽车钣金外形检测折弯件钣金件热成型加工件的应用...
- dw可以编辑java吗_为什么很多人说 Java 不适合编写桌面应用?
- keepalive+nginx实现负载均衡高可用_超详细的LVS+keepalived+nginx实现高性能高可用负载均衡集群教程...
- php getopt不好使,深入php中getopt的用法详解
- 人机交互时,你认为机器人是有意识的还是无意识的?