TCP长连接保持连接状态TCP keepalive设置
如有转载,请注明出处:http://blog.csdn.net/embedded_sky/article/details/42077321
作者:super_bert@csdn
对于TCP长连接保活是十分必要的,原因如下:
1、系统多在OA网和外网间有防火墙隔离,很多防火墙对一段时间内没有报文活动的socket会自动关闭。
2、对于非正常断开的连接系统并不能侦测到,比如防火墙关闭端口、网线被拔掉、电脑突然奔掉、未关闭应用程序直接关机(服务端无法释放资源)。
(调用close(fd)为正常断开,连接对端可以侦测到)
TCP长连接保持的两种办法:
1) 应用层面的心跳机制
自定义心跳消息头.,一般客户端主动发送到服务端,服务器接收后进行回应(也可以不回应),以便能够侦测连接是否异常断开。
2) TCP协议自带的保活功能
通过设置TCP keepalive的属性,打开socket的keepalive属性,并设置发送底层心跳包的时间间隔。TCP/IP五层网络模型,我们调用socket等接口是应用层的函数,TCP keepalive是在底层定时发送心跳报文,服务器端接收到底层的心跳报文直接丢弃,不关心其内容。
使用TCP keepalive来保持长连接状态显然要舒服一些,直接调用系统的API即可实现,对于系统而言负担也更轻(相对第一种办法)。
以下是windows下TCP keepalive设置的函数:
- /*@author super bert 2014-12-16*/
- /*socket TCP保持长连接函数*/
- int socket_tcp_alive(int socket)
- {
- int ret = 0;
- int keep_alive = 1;
- ret = setsockopt(socket, SOL_SOCKET, SO_KEEPALIVE, (char*)&keep_alive, sizeof(keep_alive));
- if (ret == SOCKET_ERROR)
- {
- printf("setsockopt failed: %d \n", WSAGetLastError());
- return -1;
- }
- struct tcp_keepalive in_keep_alive = {0};
- unsigned long ul_in_len = sizeof(struct tcp_keepalive);
- struct tcp_keepalive out_keep_alive = {0};
- unsigned long ul_out_len = sizeof(struct tcp_keepalive);
- unsigned long ul_bytes_return = 0;
- in_keep_alive.onoff = 1; /*打开keepalive*/
- in_keep_alive.keepaliveinterval = 5000; /*发送keepalive心跳时间间隔-单位为毫秒*/
- in_keep_alive.keepalivetime = 1000; /*多长时间没有报文开始发送keepalive心跳包-单位为毫秒*/
- ret = WSAIoctl(socket, SIO_KEEPALIVE_VALS, (LPVOID)&in_keep_alive, ul_in_len,
- (LPVOID)&out_keep_alive, ul_out_len, &ul_bytes_return, NULL, NULL);
- if (ret == SOCKET_ERROR)
- {
- printf("WSAIoctl failed: %d \n", WSAGetLastError());
- return -1;
- }
- return 0;
- }
需要#include <mstcpip.h>头文件。
转自:http://blog.csdn.net/embedded_sky/article/details/42077321
TCP长连接保持连接状态TCP keepalive设置的更多相关文章
- TCP长连接保持连接状态
对于TCP长连接保活是十分必要的,原因如下: 1.系统多在OA网和外网间有防火墙隔离,很多防火墙对一段时间内没有报文活动的socket会自动关闭. 2.对于非正常断开的连接系统并不能侦测到,比如防火墙 ...
- 我为什么要谈KeepAlive(文末增加nginx 负载tcp长连接保持 demo)
http://blog.sina.com.cn/s/blog_e59371cc0102ux5w.html 最近工作中遇到一个问题,想把它记录下来,场景是这样的: 从上图可以看出,用户通过Client访 ...
- TCP长连接与短连接、心跳机制
1. TCP连接 当网络通信时采用TCP协议时,在真正的读写操作之前,server与client之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接,连接的建立是需要三次 ...
- close_wait状态和time_wait状态(TCP连接)
1.CLOSE_WAIT的简单解决方案 不久前,我的Socket Client程序遇到了一个非常尴尬的错误.它本来应该在一个socket长连接上持续不断地向服务器发送数据,如果socket连接断开,那 ...
- 关于TCP长连接和发送心跳的一些理解
原因 TCP是一种有连接的协议,但是这个连接并不是指有一条实际的电路,而是一种虚拟的电路.TCP的建立连接和断开连接都是通过发送数据实现的,也就是我们常说的三次握手.四次挥手.TCP两端保存了一种数据 ...
- 网络编程-TCP长连接和短连接
TCP是一个面向连接的协议.无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接.下面会介绍一个TCP连接是如何建立的以及通信结束后是如何终止的. 一.TCP连接的建立与终止 1.1 建立连 ...
- TCP长连接实践与挑战
点这里立即申请 本文介绍了tcp长连接在实际工程中的实践过程,并总结了tcp连接保活遇到的挑战以及对应的解决方案. 作者:字节跳动终端技术 --- 陈圣坤 概述 众所周知,作为传输层通信协议,TCP是 ...
- TCP 长连接与短连接的区别
TCP连接 当网络通信时采用TCP协议时,在真正的读写操作之前,server与client之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接,连接的建立是需要三次握手的 ...
- TCP/IP详解--连接状态变迁图CLOSE_WAIT
终止一个连接要经过4次握手.这由TCP的半关闭(half-close)造成的.既然一个TCP连接是全双工(即数据在两个方向上能同时传递,可理解为两个方向相反的独立通道),因此每个方向必须单独地进行关闭 ...
随机推荐
- Android Studio 1.1.0 向导页(首页) 解析,以及版本控制 (SVN 和 GIT 的检出)
使用Android Studio首先要理清楚, Android Studio 的 project 相当于Eclipse的 Workspace Android Studio 的 module 相当于E ...
- 关于android fragment 某些使用记录
1.首先是当android2.3.3之前还是用着android-support-v4.jar来加载Fragment时. a.在xml布局应该如何定义呢? 答案:用FrameLayout标签来定义(在a ...
- 分布式系统的那些事儿(四) - MQ时代的通信
之前在讲RPC通信的各种好处,特别好用,但是RPC并不是万能的,也并不是适用于各种场景的,因为他是同步的:现如今很多场景下的调用都是异步的,系统A调用B后,并不需要知道B的结果,而且对B的结果无所谓, ...
- Atitit atiplat_reader 基于url阅读器的新特性
Atitit atiplat_reader 基于url阅读器的新特性 1.1. feature功能特性1 1.2. note1 1.1. feature功能特性 支持url数据源,实际就是只支持一层连 ...
- [IOS]开源库RegexKitLite正则表达式的使用
1.去RegexKitLite下载类库,解压出来会有一个例子包及2个文件,其实用到的就这2个文件,添加到工程中. 2.工程中添加libicucore.dylib frameworks. 友情提醒:一般 ...
- 【Unity】11.7 布料
分类:Unity.C#.VS2015 创建日期:2016-05-02 一.简介 Unity提供了两种布料组件:交互布料(Interactive Cloth).蒙皮布料(Skinned Cloth).为 ...
- nginx check_http_send type=http 查检测不到后端TOM的存活
原因:定位到../conf/server.xml中 <Connector port="8020" protocol="org.apache.coyote.http1 ...
- 无法加载 DLL“ParkCOM.dll”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E) 终结者
C#调用利用C++写的dll 常遇到的情况是无法加载DLL"***.dll":找不到指定的模块(异常来自HRESULT:0x8007007E)终极解决方法如下: 1.产生原因 可能 ...
- Asp.net Core 项目API接口服务器部署
Windows server 2008服务器部署: DotNetCore.1.0.0.RC2-WindowsHosting 或者DotNetCore.1.0.5_1.1.2-WindowsHostin ...
- Asp.Net IIS7.5伪静态设置
注意:先要将应用池设置为集成模式,修改OK后,再改成经典模式.否则,什么托管程序出不来. 1.新建网站,这里不做介绍,很简单.并把网站设置为集成模式 2.添加通配符脚本映射 打开之后显示如下界面,在右 ...