socket选项自带的TCP异常断开检测
TCP异常断开是指在突然断电,直接拔网线等等情况下,如果通信双方没有进行数据发送通信等处理的时候,无法获知连接已经断开的情况.
在通常的情况下,为了使得socket通信不受操作系统的限制,需要自己在应用层实现心跳包机制,来检查异常断开的情况,一般的方式就是服务器在一段时间没有收到客户端数据包时,定时发包,然后客户端回应,如果已经出现异常断开则服务器接收会返回错误,而客户端在指定时间内没有收到数据包,则主动向服务器发包,得到错误就说明断开.诸如此类的方式就是自己实现的心跳包机制.
但操作系统本身也自带了一些心跳包机制,这些机制是由socket的TCP栈底层实现的,不会影响应用层通信,也不需要应用层自己处理,发现异常断开可以自行检查出来并返回错误(它的本质也是在空闲时发送心跳包).以下介绍一下Windows以及linux下的方法.
首先介绍Windows下的方法,该方式要求通信双方必须都是Windows NT以上操作系统(如果是其它版本操作系统,如linux等等,不敢保证100%无效).MSDN中有描述WSAIoctl中的SIO_KEEPALIVE_VALS选项,该选项以及struct tcp_keepalive的定义在MSTCPiP.h有,不进行说明了,直接看代码:
#include <MSTCPiP.h>
DWORD retBytes;
tcp_keepalive inKeepSetting;
tcp_keepalive retKeepSetting;
inKeepSetting.onoff = 1; //探测次数
inKeepSetting.keepalivetime = 5500; // 首次探测开始前的tcp无数据收发空闲时间
inKeepSetting.keepaliveinterval = 3000; // 每次探测的间隔时间
if (WSAIoctl(aptSock, SIO_KEEPALIVE_VALS,
&inKeepSetting,
sizeof(inKeepSetting),
&retKeepSetting,
sizeof(retKeepSetting),
&retBytes,
NULL,
NULL) != 0)
{
printf("WSAIoctl Error: %d/n", WSAGetLastError());
}
Linux下的方式是通过setsockopt来设置选项,见代码(代码从网络上摘录了部分):
#include <netinet/tcp.h>
……
#define SOCKET_ERROR (-1)
// 以秒为单位
int keepAlive = 1; //设定KeepAlive
int keepIdle = 5; //首次探测开始前的tcp无数据收发空闲时间
int keepInterval = 3; //每次探测的间隔时间
int keepCount = 2; //探测次数
if(setsockopt(s,SOL_SOCKET,SO_KEEPALIVE,(void*)&keepAlive,sizeof(keepAlive)) == SOCKET_ERROR)
printf("Call setsockopt error, errno is %d/n", errno);
if(setsockopt(s,SOL_TCP,TCP_KEEPIDLE,(void *)&keepIdle,sizeof(keepIdle)) == SOCKET_ERROR)
printf("Call setsockopt error, errno is %d/n", errno);
if(setsockopt(s,SOL_TCP,TCP_KEEPINTVL,(void *)&keepInterval,sizeof(keepInterval)) == SOCKET_ERROR)
printf("Call setsockopt error, errno is %d/n", errno);
if(setsockopt(s,SOL_TCP,TCP_KEEPCNT,(void *)&keepCount,sizeof(keepCount)) == SOCKET_ERROR)
printf("Call setsockopt error, errno is %d/n", errno);
socket选项自带的TCP异常断开检测的更多相关文章
- TCP连接异常断开检测(转)
TCP是一种面向连接的协议,连接的建立和断开需要通过收发相应的分节来实现.某些时候,由于网络的故障或是一方主机的突然崩溃而另一方无法检测到,以致始终保持着不存在的连接.下面介绍一种方法来检测这种异常断 ...
- (转)TCP连接异常断开检测
TCP是一种面向连接的协议,连接的建立和断开需要通过收发相应的分节来实现.某些时候,由于网络的故障或是一方主机的突然崩溃而另一方无法检测到,以致始终保持着不存在的连接.下面介绍一种方法来检测这种异常断 ...
- tcp异常断开的重连解决方法
1.select超时重连 http://bbs.chinaunix.net/thread-4162149-1-1.html 2.http://bbs.csdn.net/topics/350074818 ...
- Linux 高性能服务器编程——socket选项
socket选项函数 功能:用来读取和设置socket文件描述符属性的方法 函数: #include <sys/scoket.h> int getsockopt ( int sockfd, ...
- 在c#中利用keep-alive处理socket网络异常断开的方法
本文摘自 http://www.z6688.com/info/57987-1.htm 最近我负责一个IM项目的开发,服务端和客户端采用TCP协议连接.服务端采用C#开发,客户端采用Delphi开发.在 ...
- TCP/IP以及Socket聊天室带类库源码分享
TCP/IP以及Socket聊天室带类库源码分享 最近遇到个设备,需要去和客户的软件做一个网络通信交互,一般的我们的上位机都是作为客户端来和设备通信的,这次要作为服务端来监听客户端,在这个背景下,我查 ...
- Socket: Java Socket 几个重要的TCP/IP选项解析(转)
Socket选择可以指定Socket类发送和接受数据的方式.在JDK1.4中共有8个Socket选择可以设置.这8个选项都定义在java.net.SocketOptions接口中.定义如下: publ ...
- TCP异常关闭研究分析
版权声明:本文由谢代斌原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/108 来源:腾云阁 https://www.qclo ...
- JAVA Socket 底层是怎样基于TCP/IP 实现的???
首先必须明确:TCP/IP模型中有四层结构: 应用层(Application Layer).传输层(Transport Layer).网络层(Internet Layer ).链路层( ...
随机推荐
- mount loop最大数的调整
mount: could not find any free loop device vi /etc/modules.conf Add "options loop max_loop=64&q ...
- OC9_字符串的内存管理
// // main.m // OC9_字符串的内存管理 // // Created by zhangxueming on 15/6/18. // Copyright (c) 2015年 zhangx ...
- 使用PSD设计网页页面
一.一个独立的页面 1.分析这个页面,在脑海或草稿上要确立页面板块布局(如版块区域的,位置和大小)2.根据设计稿的的情况,分析背景图的分布.ICO图的分布等 3.切割相应的图片,导出.合并图片(一般用 ...
- 在Spring中使用cache(EhCache的对象缓存和页面缓存)
Spring框架从version3.1开始支持cache,并在version4.1版本中对cache功能进行了增强. spring cache 的关键原理就是 spring AOP,通过 spring ...
- Random类(java.util)
转自 Random类中实现的随机算法是伪随机,也就是有规则的随机.在进行随机时,随机算法的起源数字称为种子数(seed),在种子数的基础上进行一定的变换,从而产生需要的随机数字. 相同种子数的Rand ...
- 九,WPF资源
WPF资源的优点 WPF资源系统是一种保管一系列有用对象的简单方法,从而可以更容易地重用这些对象,它主要有以下优点: 高效,通过资源可以定义一个对象,并在标记中的多个地方重用,这会使代码变的更加精简, ...
- clients(PV操作共享内核内存进行输入输出分屏) - server(进程间通信)模型实现
1.拓扑结构 2.PV操作共享内核内存进行输入输出分屏 (1) int semop(int semid,struct sembuf *sops,size_t nsops): 功能描述 操作一个或一组信 ...
- wampserver安装后的基本配置
wampserver安装后的基本配置 1.WampServer的安装 下载好安装包后,你能在保存其文件夹中找到这样一个图标: 双击它,会弹出如下提示 提示信息:不要试图从Wamp5 1.x(x代表任意 ...
- Swift与Objective-C的对比
WWDC 2014上苹果再次惊世骇俗的推出了新的编程语言Swift 雨燕, 这个消息会前没有半点风声的走漏.消息发布当时,会场一片惊呼,相信全球看直播的码农们当时也感觉脑袋被敲了一记闷棍吧.于是熬夜学 ...
- 【BZOJ1468】Tree
Description 给你一棵TREE,以及这棵树上边的距离.问有多少对点它们两者间的距离小于等于K Input N(n<=40000) 接下来n-1行边描述管道,按照题目中写的输入 接下来是 ...