- 浏览: 19518 次
最新评论
Socket与拔掉网线
2011年09月18日
当客户端与服务端通过Tcp Socket进行通信时,如果客户端应用正常退出或异常退出,服务端都会在对应的连接上获取感知(如返回0、或抛出异常)。但是,如果客户端的网线被拔掉,那么,默认情况下,服务端需要在2个小时后才会感知客户端掉线。对于很多服务端应用程序来说,这么长的反应时间是不能忍受的。
我们通常在应用层使用“心跳机制”来解决类似的问题,这是可行的。
然而,在这里,我们可以使用Socket自己的心跳机制来解决这一问题。 System.Net.Sockets.Socket提供了IOControl()方法给我们来设置Sokect的心跳机制的相关参数。比如,我们设置KeepAlive的时间为20秒,检查间隔为2秒。可以这样做:
int keepAlive = -1744830460; // SIO_KEEPALIVE_VALS
byte[] inValue = new byte[] { 1, 0, 0, 0, 0x20, 0x4e, 0, 0, 0xd0, 0x07, 0, 0 }; //True, 20 秒, 2 秒
sock.IOControl(keepAlive, inValue, null);
20秒(20000毫秒)的16进制表示是4e20,2秒(2000毫秒)的16进制表示是07d0,如此,你可以修改inValue参数为自己希望的值。
在上述设置下,如果拨掉客户端网线,服务器Socket.Receive()会在20秒后抛出异常。
QUOTE:
原帖由 mynets 于 2006-11-21 16:25 发表
TCP protocol has a timer to determine if the connection is abnormally closed. But this timeout value is very long by default and if you want to check this situation as soon as possible to improve p ...
现在就是不想用 链路维持包 。呵呵。
不过终于知道很多协议中为什么要有这个东西了。http://bbs.chinaunix.net/thread-859015-1-1.html
http://blog.csdn.net/fan_hai_ping/article/details/6691560
最近在做一个TCP采集程序,使用到C/S的结构。功能比较的简单,就是TCP采集程序作为服务器,信令采集设备作为客户端,客户端与服务器端之间建立长连接之后,开始发送信令报文给服务器。在服务器端使用多线程方式来处理每个客户端的socket连接,服务器端不主动断开链路,也没有心跳机制来维护连接的状态,客户端发送数据的时间也是不一定的,只要有采集到信令数据时才进行发送。在客户端socket断开后,服务器端应该能够知道并且释放socket资源。
判断socket是否已经断开的方法是使用非阻塞的select方式进行socket检查,步骤如下:
1)设置接收到的socket为异步方式;
2)使用select()函数测试一个socket是否可读;
3)如果select()函数返回的值为1,但是使用recv()函数读取的数据长度为0,那么说明该socket已经断开。
如果recv()返回值小于等于0时,客户端的连接已经断开,但是还需要判断errno是否等于EINTR。如果errno=EINTR则说明recv()函数是由于程序接收到中断信号后返回的,socket连接应该还是正常,步应该close掉socket连接。
注:对于阻塞socket的recv函数会在以下三种情况下返回值:
1)接收到数据时会返回;
2)程序接收到信号时返回-1,errno=EINTR;
3)Socket出现问题时,返回-1,具体的错误码请查看man recv;
4)一定要养成查看man说明,内容很详细,很有帮助。
这种方法经过长时间的测试证明是有效的,仅供大家参考。
此外,UNP卷一上有很多socket异常情况下的模拟解释,大家可以去阅读下。如果网络中间有多级路由,路由当掉等很多情况出现,所以建议程序中在应用层中加入心跳(heartbeat机制)和重连来维持连接的状态。
TCP protocol has a timer to determine if the connection is abnormally closed. But this timeout value is very long by default and if you want to check this situation as soon as possible to improve performance, the best solution is to introduce a keepalive mechanism in application protocol design.
TCP协议有一个定时器来决定连接是否被异常关闭。但是该超时时间值缺省的情况下会非常长,如果你希望尽快的检查出这种状态改进性能,最好的方法就是在应用程序协议设计的时候引入keepalive(保持连接)机制。
分享到:
发表评论
-
三极管场效应参数全集
2012-01-20 11:54 1441三极管场效应参数全集 2012年01月18日 品 名 ... -
2011-11-04
2012-01-20 11:54 5372011-11-04 2011年01月19日 316不锈 ... -
2011-09-03
2012-01-20 11:54 7322011-09-03 2011年09月03日 本篇是制作 ... -
“书香校园”读书知识竞赛试题(四)
2012-01-20 11:54 835“书香校园”读书知识竞赛试题(四) 2010年11月01日 ... -
四(4)寒假作业
2012-01-19 16:43 644四(4)寒假作业 2012年01 ... -
《墨水心》(Inkheart)
2012-01-19 16:43 649《墨水心》(Inkheart) 2012年01月12日 ... -
只为了给那些想学英语的人
2012-01-19 16:43 374只为了给那些想学英语 ... -
【转】大学英语学习之我见――给大一新生的学习建议
2012-01-19 16:43 584【转】大学英语学习之 ... -
研究报告
2012-01-19 16:43 637研究报告 2010年06月10日 ... -
使用 Socket 通信实现 FTP 客户端程序
2012-01-17 06:28 855使用 Socket 通信实现 FTP 客户端程序 2011年 ... -
C++ SOCKET常用转换函数
2012-01-17 06:28 1324C++ SOCKET常用转换函数 2 ... -
C#中判断socket是否已断开的方法
2012-01-17 06:28 3510C#中判断socket是否已断开的方法 2011年09月07 ... -
socket性能优化(上)
2012-01-17 06:28 873socket性能优化(上) 2012 ... -
学习英语的四十二个要决(1)
2012-01-16 05:09 610学习英语的四十二个要决(1) 2009年06月25日 学 ... -
学好英语的20个经典要诀
2012-01-16 05:09 635学好英语的20个经典要 ... -
小升初学习英语的几个技巧分享
2012-01-16 05:09 649小升初学习英语的几个技巧分享 2011年12月29日 小 ... -
用TTS技术开发具有文本朗读功能的应用程序(转)之一
2012-01-16 05:09 966用TTS技术开发具有文本 ... -
想学好英文吗?
2012-01-16 05:09 555想学好英文吗? 2010年11月20日 想
相关推荐
java Socket 长链接拔网线检测。
C#中用Socket实现判断网络是否断开的实例[参照].pdf
SuperSocket Socket C# 通讯详细介绍,不错的 Socket,学习很有用处SuperSocket Socket 技能
此案例采用modbus-tcp协议与设备进行通信,且分别应用Socket与第三方组件NModbus两种方式进行通信。
socket概念socket概念socket概念
socket转发、socket与RS485互转工具
Socket网络编程进阶与实战系统掌握Socket核心技术,本课程将理论结合实践,带你从零开始,系统学习Socket编程技术,让Socket的学习不再那么零散与难以掌握,同时会提炼出Socket网络传输的核心思想与构架,并带你踩坑...
C# socket通信(免积分下载),本项目有三个部分:1、客户端(winform);2、服务端(winform);3、socket功能类库模块(其他项目也可以引用),socket类库模块功能齐全,只需调用其中方法即可,复用性较强,代码...
SocketTool调试软件是一款网络TCP/UDP通信调试工具,本工具集功能强大与简单易用为一体,是无需安装的免费绿色软件。 它可以帮助网络编程人员、网络维护人员检查所开发的网络应用软硬件的通信状况。 是一款非常好用...
socket详解 socket详解 socket详解 socket详解 socket详解 socket详解 socket详解 socket详解
【程序老媛出品,必属精品,亲测校正,...资源名:C#与三菱PLC 进行socket通信 程序源码 资源类型:程序源代码 源码说明: C#与三菱FX5U socket通信,内有C#程序 三菱FX5U程序 适合人群:新手及有一定经验的开发人员
c#超级Socket库SuperSocket,SOCKET多线程编程
Android客户端通过socket与服务器通信
vs2017环境,windows系统,检测网线插入拔出状态。核心代码短短30行。亲测可用,我实际用到了工程中,报告网线是否插入。
SocketTool SocketTool SocketTool SocketTool SocketTool
安卓socket与服务器通讯源码.zip 安卓socket与服务器通讯源码.zip 安卓socket与服务器通讯源码.zip
C# 版socket 收发TCP协议有模版样例
【亲测实用】c# socket与基恩士plc通讯、和扫码枪通讯程序源码 文件类型:程序源代码 主要功能: 工业通讯,c# socket与基恩士plc通讯、和扫码枪通讯 适合人群:新手及有一定经验的开发人员
SuperSocket-master_Socket 、Socket、SuperSocket、TCP、UDP