如何判断一个Socket是否断开?
2014-02-25 20:29
169 查看
非阻塞模式,如果暂时没有数据,返回的值也会是<=0的,如果用阻塞模式的话,返回<=0的值是可以认为socket已经无效了。
当使用 select()函数测试一个socket是否可读时,如果select()函数返回值为1,且使用recv()函数读取的数据长度为0 时,就说明该socket已经断开。
经过代码试验,如果进程受到一些信号时,例如:INTR,recv()返回值小于等于0时,这是就需要判断 errno是否等于 EINTR , 如果errno == EINTR 则说明recv函数是由于程序接收到信号后返回的,socket连接还是正常的,不应close掉socket连接。
如果write,我觉得还有一些情况需要考虑,那就是写的太快的时候,有可能buffer写满了,这是,errno是EAGAIN,可以根据实际需要,如果errno是EAGAIN的话,再写几次。
当然,read的时候也有类似write的情况,需要check一下errno,如果是EAGAIN或者EINTR,最好不要立刻终止操作,再尝试一下。
当使用 select()函数测试一个socket是否可读时,如果select()函数返回值为1,且使用recv()函数读取的数据长度为0 时,就说明该socket已经断开。
经过代码试验,如果进程受到一些信号时,例如:INTR,recv()返回值小于等于0时,这是就需要判断 errno是否等于 EINTR , 如果errno == EINTR 则说明recv函数是由于程序接收到信号后返回的,socket连接还是正常的,不应close掉socket连接。
如果write,我觉得还有一些情况需要考虑,那就是写的太快的时候,有可能buffer写满了,这是,errno是EAGAIN,可以根据实际需要,如果errno是EAGAIN的话,再写几次。
当然,read的时候也有类似write的情况,需要check一下errno,如果是EAGAIN或者EINTR,最好不要立刻终止操作,再尝试一下。
相关文章推荐
- deep leaning toolbox学习使用1之NN
- jquery入门简介
- strcpy和strncpy区别
- 共射电路放大倍数受频率的影响
- 第一章:介绍Solr
- 【转】logback logback.xml常用配置详解(三) <filter>
- android学习日记10--裁剪区域
- The Suspects
- linux命令
- uva 10020 - Minimal coverage
- android breakpad批量解析dmp的shell脚本
- 蛇形填洞
- 【转】logback logback.xml常用配置详解(二)<appender>
- 用C#生成不重复的随机数
- TimePicker点击上下方向键 java.lang.NullPointerException异常
- 原创
- 【转】使用DirectUI技术实现QQ界面
- linux ftp服务器搭建
- Centos安装JDK,RPM安装JDK经典教程
- CRgn绘制扇形并响应鼠标move