1、阻塞模式与非阻塞模式下recv的返回值各代表什么意思?有没有区别?(就我目前了解阻塞与非阻塞recv返回值没有区分,都是<0:出
错,=0:连接关闭,>0接收到数据大小,特别:返回值<0时并且
(errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN)的情况下认为连接是正常的,
继续接收。只是阻塞模式下recv会阻塞着接收数据,非阻塞模式下如果没有数据会返回,不会阻塞着读,因此需要循环读取)。
2、阻塞模式与非阻塞模式下write的返回值各代表什么意思?有没有区别?(就我目前了解阻塞与非阻塞write返回值没有区分,都是<0:出
错,=0:连接关闭,>0发送数据大小,特别:返回值<0时并且
(errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN)的情况下认为连接是正常的,
继续发送。只是阻塞模式下write会阻塞着发送数据,非阻塞模式下如果暂时无法发送数据会返回,不会阻塞着write,因此需要循环发送)。
3、阻塞模式下read返回值 < 0 && errno != EINTR &&
amp; errno != EWOULDBLOCK && errno != EAGAIN时,连接异常,需要关闭,read返回
值 < 0 && (errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN)
时表示没有数据,需要继续接收,如果返回值大于0表示接送到数据。
非阻塞模式下read返回值 < 0表示没有数据,= 0表示连接断开,> 0表示接收到数据。
这2种模式下的返回值是不是这么理解,有没有跟详细的理解或跟准确的说明?
4、阻塞模式与非阻塞模式下是否send返回
值< 0 && (errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN)
表示暂时发送失败,需要重试,如果send返回值<= 0, && errno != EINTR &&
amp; errno != EWOULDBLOCK && errno != EAGAIN时,连接异常,需要关闭,如果send返回
值 > 0则表示发送了数据?send的返回值是否这么理解,阻塞模式与非阻塞模式下send返回值=0是否都是发送失败,还是那个模式下表示暂时
不可发送,需要重发?
5、很多人说阻塞模式下read会阻塞着读,是否这样?我和同事试了不会阻塞read。
IO操作选择阻塞还是不阻塞,主要还是依赖设备是否为低速设备。
read一般都是非阻塞的,读不到就返回。
recv 其实也是read,只不过读取的设备是socket接收缓冲区而已。
send不管它是不是阻塞,它发送成功只表示数据写入缓冲区,不能代表数据被对面成功接受。
阅读(1163) | 评论(0) | 转发(1) |