中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > C/C++
急!!!tcp如何实时检测通讯对象的连接状态。
作者:未知 时间:2005-09-13 19:17 出处:ChinaUnix.net 责编:chinaitpower
              摘要:急!!!tcp如何实时检测通讯对象的连接状态。

情况介绍: 
一台PC机(SERVER),有且只有一台单片机(CLIENT)。 
SERVER建立后便间隔一段时间向CLIENT发包。 而CLIENT的断开只有通过断电处理,而且,断电与再连接SERVER速度是非常快的。 
出现的情况是,CLIENT断电重起了,SERVER还在向外发包。CLIENT并没有收到,估计也没有连接到SERVER(因为SERVER的MAX CONNECTION是1)。过了非常长的时间,SERVER提示出错然后重新ACCEPT CLIENT的连接, 恢复正常。 

显然这样长时间的等待是不行了,通过什么办法可以象每次检查一个变量那样来检测当前的连接状态信息呢? 或者怎样能够将SERVER端的等待时间缩短? 

这个问题非常急,希望高手能够指教,在下先谢了!本人在上海,能够提供帮助者本人请客吃饱!! :) 


 菜青虫 回复于:2002-07-31 21:59:09
pc上面是用的什么系统?win?unix?这个问题应该不是很难解决吧。看在你这么好心的要请客,告诉你吧,我也在上海,有问题直接发mail给我好了,ergataner@hotmail.com,嘿嘿,请客哦。我现在帮你试一下win和freebsd好了。:),有结果,我贴上来。

 jkl 回复于:2002-07-31 22:33:13
PC上的是red hat 7.3 linux. 


     ;~~~~~~~~~~~~(

 iloveunix 回复于:2002-08-01 09:15:48
可以使用“带外数据”检测连接状态,又不影响正常的数据传输。

 yuejw 回复于:2002-08-01 09:19:09
有两种办法可以解决你的问题。
第一种是自己写一个套接字读、写操作超时处理机制,一旦超时就认为对方已经崩溃。
第二种是利用套接口保持存活选项(SO_KEEPALIVE)。

 Eisen 回复于:2002-08-01 09:42:36
啊。很简单,用ioctl定义一个SO_KEEPALIVE就行了。
不过更好的是自己另外实现一个控制信道在Client和Server 间互通消息。

呵呵。我也是上海的…… //虎视中

 iloveunix 回复于:2002-08-01 13:03:23
不建议采用SO_KEEPALIVE选项!
因为默认设置是空闲2小时才发送一个“保持存活探测分节”,不能保证实时检测!
当然也可以修改时间间隔参数,但是会影响到所有打开此选项的套接口!
因此还是自己编写超时机制比较好,可以根据应用的可靠性程度灵活设置超时。

 netstorm 回复于:2002-08-23 14:41:22
看一下Unix网络编程, 利用TCP带外数据,自己做个客户-服务心跳函数

 华夏很行 回复于:2002-08-25 16:11:18
只管吃饱不管吃好,每人10碗米饭,撑死你们,哈哈

 badeager 回复于:2002-08-28 00:25:30
可用发送OOB数据进行心跳检测,这样可避免此类情况!

 xiaodixiaodi 回复于:2002-08-31 16:55:16
用alarm来缩短此时间!

 lzhu 回复于:2002-10-09 15:53:43
不知你说的SERVER和CLIENT是指机器还是指通讯端,据我所知,tcp交易的发起是从client开始的吧,还有server向client发请求的吗,server一般收到请求后给client回应,不会主动发交易吧.如果按我说的这样,设置timeout不就ok了,或者要求server给client回应包.

以上想法纯属个人意见

 蓝色键盘 回复于:2003-03-19 13:47:57
[quote:617af623ef="lzhu"]不知你说的SERVER和CLIENT是指机器还是指通讯端,据我所知,tcp交易的发起是从client开始的吧,还有server向client发请求的吗,server一般收到请求后给client回应,不会主动发交易吧.如果按我说的这样,设置timeout不就ok了,或者要求server给client回应包.

以上想法纯属个人意见[/quote:617af623ef]1、一旦两个同一或不同主机间进程建立的socket连接,谁给谁发送信息都是任意的。除非一方主动关闭连接或者发生异常。
2、连接connect过程中,client是主动的,而server一般处于accept或select阻塞状态,属于被动的。

 罗格纳 回复于:2003-03-20 10:04:38
很简单阿,写一个超时控制模块,难道你以前都不写?

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有