建立TCP连接,可有一方down机了另一方怎样知道呢??迫切

hjt79 2003-10-17 02:41:01
我有个问题很急,请帮助我!!!
服务器和客户机建立了TCP连接(用CSocket做)之后,但客户机忽然down机了,那么服务器端怎样知道该客户机down机了呢?因为我必须知道那个客户机不能跟服务器连接上就要在服务器关闭原来跟那个客户机建立的连接,请问,有办法吗
...全文
92 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
hjt79 2003-10-25
  • 打赏
  • 举报
回复
我根据大家的意见去看了keepAlive的用法,发现:在windowScoket1中用的setsockopt(。。。,KEEP_ALIVE)需要在注册表中设置其发送探测包的时间间隔,但这样会影响本机所有的TCP连接,这样影响不好,而在windowSocket2中我发现了函数WSAioctl中可用SIO_KEEPLIVE_VAL参数针对每一socket进行单独设置其探测包发送的时间间隔,这是非常好的,不会影响其他socket。

但最后我还是用自己写一个检测方法,正如studyingpersons(深入学习)朋友所说,我在服务器设标志,让客户端定时发信息去修改对应的标志,而服务器则定时去查询这些标志,如果发现有标志没修改,则认为对应的客户端掉了,做关闭其连接操作

不知道是否有其他人对我的做法有另外的观点
flinming 2003-10-24
  • 打赏
  • 举报
回复
看看onclose事件。。。。。。有个断开值。。。
chenshijin 2003-10-24
  • 打赏
  • 举报
回复
你可以调用setsockopt(。。。,KEEP_ALIVE),具体可以参见MSDN上面的文章:How to Determine Loss of Client/Server Connection
beyondtkl 2003-10-23
  • 打赏
  • 举报
回复
TCP连接是时刻保持连接状态的
只要有连接 服务器当然知道它是连接的
而客户端死机了 自然服务器就会知道
TCP有一种技术 叫着 keep alive 叫保活
你可以去看看
hjt79 2003-10-23
  • 打赏
  • 举报
回复
以上的各种方法都好,真谢谢大家,希望继续有人能发表意见
mfkzj 2003-10-22
  • 打赏
  • 举报
回复
sevencat你太牛B了 哈哈
楼上说的发验证信息的方式还是比较实际的 很多的程序是这样出来的
如果你需要在TCP中得到这个消息 那只有看一下tcp/ip详解
pigcatpig 2003-10-22
  • 打赏
  • 举报
回复
老调重谈了,建议去网络那边看看,有的是这种问题,这种问题mfc没法处理,比较底层的...
SyDes21 2003-10-22
  • 打赏
  • 举报
回复
在WinSock中,Server通过判断是否从Client接到一个FD_CLOSE,若接到了FD_CLOSE则说明Client down了. 我这个你参考一下,至于MFC CSocket我就不知道了. 我想应该有类似的实现方法吧.
powgu 2003-10-22
  • 打赏
  • 举报
回复
客户端做个关机触发事件。。
一关就响应发关机信息。。
nj_draker 2003-10-22
  • 打赏
  • 举报
回复

开个线层不断去收数据,看recev的返回值,如果断线就立刻可以看出来了
ydzqw 2003-10-22
  • 打赏
  • 举报
回复
写个HeartBeat吧
iq199 2003-10-21
  • 打赏
  • 举报
回复
以下抄自tcp/ip详解:

保活并不是T C P规范中的一部分。Host Requirements RFC提供了3个不使用保活定
时器的理由: (1) 在出现短暂差错的情况下,这可能会使一个非常好的连接释放掉;
(2)它们耗费不必要的带宽;(3)在按分组计费的情况下会在互联网上花掉更多的钱。

建议楼主去看tcp/ip详解第23章
Weiguo 2003-10-21
  • 打赏
  • 举报
回复
我正要做个关于FTP的东西,还没眉目,请指点以下,我们可以共同研究
hjt79 2003-10-21
  • 打赏
  • 举报
回复
用发包的办法是可以,但是比较复杂,可以不可以简单一点,就是说当死机,非法退出程序,或网路不通了,有没有简单的检测函数呢??
sevencat 2003-10-17
  • 打赏
  • 举报
回复
keepalive
自己写心跳
如果是死机,这时候服务器能监测到的。

最简单的办法:
在软件使用说明上写上:
如机器死机请立刻打电话至:0512-XXXXXXXX
studyingpersons 2003-10-17
  • 打赏
  • 举报
回复
有办法,就是你得使用一套通信标准。
该标准中必须有一个条款规定每隔多长时间客户机向服务器发送一个包,包格式自己定义,只要能说明这个客户端此时在线就行。当服务器经过一个比较长的时间后,一直没有得到某个客户端的这样的数据包,那么就认为此客户端已经掉线,可以关闭与它的连接了!!!

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧