检测SOCKET是否断开
来源:互联网 发布:制作简谱软件 编辑:程序博客网 时间:2024/06/06 20:43
http://blog.csdn.net/ghosc/article/details/5718978
1. 发送重试,由业务完成。
因为club_l5的send接口不会保留用户发送的内容,在recv失败的情况下,用户发送的数据已经丢失,所以只能由业务进行重试。
结论:否定。由于后端服务器有多台,每次发送的时候并不能不能保证连接的机器还是上次发送的那一台服务器,有可能后端所有的连接都被断开,虽然失败比例有所降低,还是不能解决问题。
2. 修改服务器端关闭连接的等待时间。
治标不治本,可以在紧急情况下使用。
经过和still、allan、robby、steven一起讨论,最佳的方案就是在发送的时候,就能感知到服务器端已经关闭连接,经过讨论,给出以下解决方案:
3. 在send之前对先对read进行selcect,并使用read检验连接的状态。
在send之前先对select函数read进行select,并设置时间参数设为0,select会立即返回,如果有FIN包可立刻知道,再进行read,如果read的返回值 <= 0,则说明连接有问题,或接收到了fin包,此时需关闭连接进行重连。
4. 使用poll()函数是否处于POLLRDHUP(套接字半关闭)状态。
如果是,则关闭连接进行重连,目前还不完全成熟,且不适用于内核版本较低的系统。
5. 使用系统调用getpeername函数加系统错误码的方式检查对端是否关闭连接。
用法如下:if(getpeername (sock, &addr, &len) < 0 && errno == ENOTCONN) 当此条件成立的时候,说明对端已经关闭连接。
6. 发送之前用MSG_PEEK的方式recv。
看recv的返回值是否0字节,如果是0字节,说明对方发送了fin包,已关闭了连接。allan给出TTC中验证连接是否有效的函数:
- int CPollerObject::CheckLinkStatus(void)
- {
- char msg[1] = {0};
- int err = 0, errno;
- err = recv(netfd, msg, sizeof(msg), MSG_DONTWAIT|MSG_PEEK);
- /* client already close connection. */
- errno = WSAGetLastError();
- if(err == 0 || (err < 0 && errno!= EWOULDBLOCK))
- return -1;
- return 0;
- }
综合集中方案,最好采用6方案。
- 检测SOCKET是否断开
- 检测socket链接是否断开
- 检测socket链接是否断开
- socket中使用心跳来检测连接是否断开
- 检查socket是否断开
- linux socket tcp 断开检测
- iOS检测网络是否断开
- 如何检查Socket是否断开
- 如何判断Socket是否断开
- 如何判断Socket是否断开
- 如何检查Socket是否断开
- 如何检查Socket是否断开
- Androin学习笔记四十二:Java android Socket通信检测(server)连接是否断开
- [Linux]检测socket异常断开--keepalive
- android中检测网络是否断开
- 判断socket是否已断开的方法
- java判断socket服务器端是否断开连接
- java socket判断客户端是否断开连接
- Cocoa的编码规范
- CentOS 7.0.1406
- js 使用驱动调用硬件
- 南京邮电大学OJ——1062直接插入排序
- mysql 全部备份的shell脚本
- 检测SOCKET是否断开
- 图像分割方法概述
- USACO 2.1.5 Hamming Code
- 排序问题
- android上传图片至服务器
- 简单插入排序
- 使用sqoop1导出mysql数据到hbase中
- eclipse创建android项目点击finish没反应
- 算法复杂度