nonblock: 同上 缓冲区无数据: block:将阻塞等待缓冲区有数据 nonblock:立即返回,返回值-1,同时设置errno := EAGAIN 类似的,对于send(), connect(), bind(), accept(),均有类似一样的区别 设置 有如下方式设置nonblock 新建socket 时设置 在传入 socket type 时,同时置SOCK_NONBLOCK位为1 sock = socket(AF_...
block是堵塞。nonblock是非堵塞。堵塞方式,是在下达指令后,一直等待指令的回应结果。等待期间,无法做其他事情。编程简单。非堵塞方式,在下达指令后,可以去做其他工作,如果收到指令完成的通知,再去处理指令结果。编程复杂。
nonblock/block,不仅仅是在read,write上体现出来,在connect,accept,send,recv等和外设操作有关的函数都能体现出来.block时,函数等到此操作结束才返回.一般可以根据返回值来判断成功失败.nonblock时,函数只是对已经存在的数据进行做作,不等待.要有其他方法来判断成功失败.
0 : sk->sk_rcvtimeo;timeo=sock_rcvtimeo(sk,nonblock);...// 如果设置了MSG_WAITALL标识target=需要读的长度// 如果未设置,则为最低低水位值target=sock_rcvlowat(sk,flags&MSG_WAITALL,len);...do{// 表明读到数据if(copied){// 注意,这边只要!timeo,即nonblock设置了就会跳出循环if(sk->sk_err||...
// 更改socket为nonblockfcntl(sock_fd, F_SETFL, fdflags | O_NONBLOCK); // connect ... while(1) { int recvlen = recv(sock_fd, recvbuf, RECV_BUF_SIZE) ; ... } ... 由于网络协议非常复杂,内核里面用到了大量的面向对象的技巧,所以我们从创建连接开始,一步一步追述到最后代码的调用点。 so...
大部分高性能网络框架采用的是非阻塞模式。笔者这次就从linux源码的角度来阐述socket阻塞(block)和非阻塞(non_block)的区别。 本文源码均来自采用Linux-2.6.24内核版本。 一个TCP非阻塞client端简单的例子 如果我们要产生一个非阻塞的socket,在C语言中如下代码所示: ...
// 等效为timo = noblock ? 0 : sk->sk_rcvtimeo; timeo=sock_rcvtimeo(sk,nonblock); ... // 如果设置了MSG_WAITALL标识target=需要读的长度 // 如果未设置,则为最低低水位值 target=sock_rcvlowat(sk,flags&MSG_WAITALL,len); ... do{ // ...
引用在网上看到的比较好的描述 “阻塞 block 是指,你拨通某人的电话,但是此人不在,于是你拿着电话等他回来,其间不能再用电话。同步大概和阻塞差不多。非阻塞 nonblock 是指,你拨通某人的电话,但是此人不在,于是你挂断电话,待会儿再打。至于到时候他回来没有,只有打了电话才知道。即所谓的“轮询 / poll”。
网络编程中超时时间是一个重要但又容易被忽略的问题,对其的设置需要仔细斟酌。在经历了数次物理机宕机之后,笔者详细的考察了在网络编程(tcp)中的各种超时设置,于是就有了本篇博文。本文大部分讨论的是socket设置为block的情况,即setNonblock(false),仅在最后提及了nonblock socket(本文基于linux 2.6.32-431内核)。
网络编程中超时时间是一个重要但又容易被忽略的问题,对其的设置需要仔细斟酌。在经历了数次物理机宕机之后,笔者详细的考察了在网络编程(tcp)中的各种超时设置,于是就有了本篇博文。本文大部分讨论的是socket设置为block的情况,即setNonblock(false),仅在最后提及了nonblock socket(本文基于linux 2.6.32-431内核)。