我有个问题很急,请帮助我!!!
服务器和客户机建立了TCP连接(用CSocket做)之后,但客户机忽然down机了,那么服务器端怎样知道该客户机down机了呢?因为我必须知道那个客户机不能跟服务器连接上就要在服务器关闭原来跟那个客户机建立的连接,请问,有办法吗

解决方案 »

  1.   

    我正要做个关于FTP的东西,还没眉目,请指点以下,我们可以共同研究
      

  2.   

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

  3.   

    在WinSock中,Server通过判断是否从Client接到一个FD_CLOSE,若接到了FD_CLOSE则说明Client down了. 我这个你参考一下,至于MFC CSocket我就不知道了. 我想应该有类似的实现方法吧.
      

  4.   

    老调重谈了,建议去网络那边看看,有的是这种问题,这种问题mfc没法处理,比较底层的...
      

  5.   

    sevencat你太牛B了 哈哈
    楼上说的发验证信息的方式还是比较实际的 很多的程序是这样出来的 
    如果你需要在TCP中得到这个消息 那只有看一下tcp/ip详解
      

  6.   


     开个线层不断去收数据,看recev的返回值,如果断线就立刻可以看出来了
      

  7.   

    TCP连接是时刻保持连接状态的
    只要有连接 服务器当然知道它是连接的
    而客户端死机了 自然服务器就会知道
    TCP有一种技术 叫着 keep alive 叫保活
    你可以去看看
      

  8.   

    你可以调用setsockopt(,KEEP_ALIVE),具体可以参见MSDN上面的文章:How to Determine Loss of Client/Server Connection
      

  9.   

    我根据大家的意见去看了keepAlive的用法,发现:在windowScoket1中用的setsockopt(,KEEP_ALIVE)需要在注册表中设置其发送探测包的时间间隔,但这样会影响本机所有的TCP连接,这样影响不好,而在windowSocket2中我发现了函数WSAioctl中可用SIO_KEEPLIVE_VAL参数针对每一socket进行单独设置其探测包发送的时间间隔,这是非常好的,不会影响其他socket。但最后我还是用自己写一个检测方法,正如studyingpersons(深入学习)朋友所说,我在服务器设标志,让客户端定时发信息去修改对应的标志,而服务器则定时去查询这些标志,如果发现有标志没修改,则认为对应的客户端掉了,做关闭其连接操作不知道是否有其他人对我的做法有另外的观点