社区
Linux/Unix社区
帖子详情
socket的block和nonblock到底有什么区别?
ceasar1134
2007-07-04 10:34:03
之前看数隐约记得是主要区别是read():
nonblock:read()在没有接收到数据时会立即返回0;
block: read()在没有接收到数据时会阻塞一段时间,时间过后还没有收到会返回一个值(这个值是0还是-1好像)
记得不是很牢,请大家帮我弄清楚这个内容
...全文
4379
4
打赏
收藏
socket的block和nonblock到底有什么区别?
之前看数隐约记得是主要区别是read(): nonblock:read()在没有接收到数据时会立即返回0; block: read()在没有接收到数据时会阻塞一段时间,时间过后还没有收到会返回一个值(这个值是0还是-1好像) 记得不是很牢,请大家帮我弄清楚这个内容
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
4 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
dai_weitao
2007-07-04
打赏
举报
回复
1楼加楼主的一起是正确答案.
ceasar1134
2007-07-04
打赏
举报
回复
比如说read()
如果此时buff()里面有5bytes的数据,而我们要read()10bytes的数据
对于block:那么只有等到buff里面有10bytes的数据是read()才返回,不管多长时间都要等待
对于nonblock:马上返回5bytes的字节
是这个意思么?
cceczjxy
2007-07-04
打赏
举报
回复
nonblock/block,不仅仅是在read,write上体现出来,在connect,accept,send,recv等和外设操作有关的函数都能体现出来.
block时,函数等到此操作结束才返回.一般可以根据返回值来判断成功失败.
nonblock时,函数只是对已经存在的数据进行做作,不等待.要有其他方法来判断成功失败.
ceasar1134
2007-07-04
打赏
举报
回复
还设计到一个read()返回值的问题。
我认为在nonblock里面read()的返回值可以按下面分类:
1、socket里面有数据:返回数据到read()的里面的buff,read()的返回值为数据长度
2、socket里面没有数据:read()返回-1,errno里面的值为EWOULDBLOCK
3、socket连接不存在(断开):read()返回0
4、read()出现错误:read()返回-1,错误代码在errno中表示
有人给补充一下在block时read()的可能返回值么?如果出现阻塞我是一直阻塞还是阻塞到一定时间后会报错?
tcp粘滞数据接收,
socket
最好使用
non
block
方式
很多人写tcp程序的时候,都不考虑tcp stream的流特性,认为对方发送两个包,我们就是收到两个包,不考虑tcp的粘滞的可能。也就是说对方发送了两个数据包,我们可能会收到一个大包,这个大包就是对方发送的两个包在一起了。所以应用程序自身有责任去保证包的完整性,本代码就是一个简单的例子。本例中
socket
采用了
block
方式,如果考虑性能,最好使用
non
block
方式。
socket
的O_
NON
BLOCK
以及TCP_NODELAY
设置
socket
的O_
NON
BLOCK
以及TCP_NODELAY 1. no-
block
ing 将
socket
设置为no-
block
ing意味着
socket
收发数据都是非阻塞的,相比于阻塞方式,需要特殊处理这个错误码:EWOULD
BLOCK
or EAGAIN(这两个错误码是一样的,都是35),进行重试或者重新调度。 将
socket
设置非阻塞有多种方法,下面会一一汇总。 1.1 fcntl设置O_
NON
BLOCK
POSIX的fcntl用的比较广泛,兼容性也比较好,优先推荐使用fcntl来设置,缺点是需要两
php
socket
set
non
block
,
socket
_set_
non
block
()
socket
_set_
non
block
()(PHP 4 >= 4.1.0, PHP 5, PHP 7)Sets
non
block
ing mode for file descriptor fd说明
socket
_set_
non
block
(resource$
socket
):boolThe
socket
_set_
non
block
() function sets the O_
NON
BLOCK
flag...
recv()
说明我的想法之前,我先纠正一下上面我犯的几个错误,也许说明这些错误对楼主也有帮助。且听我慢慢道来,嘿嘿 我的犯的最大错误是,没有搞清楚“模式”和“选项”,
BLOCK
是一种模式,而TIMEOUT只是一个在特定模式下的选项。 先说模式,一般
SOCKET
默认是
BLOCK
(阻断)模式,这种模式对send函数来说是同步的,而
NON
BLOCK
(非阻断)模式对send函数来说则是异步的。 楼主说send函
SOCK_
NON
BLOCK
,accept4 阻塞与非阻塞
SOCKET
http://www.cnblogs.com/sunada2005/p/3591378.html 谓阻塞方式的意思是指,当试图对该文件描述符进行读写时,如果当时没有东西可读,或者暂时不可写,程序就进入等待状态,直到有东西可读或者可写为止。 而对于非阻塞状态,如果没有东西可读,或者不可写,读写函数马上返回,而不会等待。 非阻塞,就是进程或线程执行此函数时不必非要等待事件的发生,一旦执行肯定返回...
Linux/Unix社区
23,114
社区成员
74,507
社区内容
发帖
与我相关
我的任务
Linux/Unix社区
Linux/Unix社区 应用程序开发区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章