当客户机关闭程序时,服务器会响应到OnClose事件,但是当客户机直接关闭机器时,服务器却并不响应OnClose事件,十分困惑,要怎样才能得到该响应呢,或者我在服务器上定时检测,该怎样呢?

解决方案 »

  1.   

    直接关硬件嘛?那是得不到的呀。要是选择shutdown,应该client能接受到消息的说。
      

  2.   

    当关闭客户端软件时,软件会发一个请求断连的TCP包,服务器收到该TCP包后,才会响应OnClose消息.但突然关机,对客户端软来讲是个突发事件,它根本来不及发送请求断连的TCP包,服务器端也就无法知道客户端已停止运行.
      

  3.   

    当关闭客户端软件时,软件会发一个请求断连的TCP包,服务器收到该TCP包后,才会响应OnClose消息.但突然关机,对客户端软来讲是个突发事件,它根本来不及发送请求断连的TCP包,服务器端也就无法知道客户端已停止运行.
     
    你可以在服务器软件和客户软件之间定义一个协议,每隔一定的时间发送一个检测网络的数据包,以确认网络的正常,如过连续发送3个数据包都没收到,则认为网络断了.
      

  4.   

    一种方法如上所述是要求客户在规定时间内发一条指定格式的数据,让服务器知道它的存在,就像犯人在保释期间要定时回来报道一样,如果超过时间没有回来报到则判断犯人逃跑,这里也是一样,如果客户在规定时间内没有反应则可以认为客户外意断线。另一种方法我没有测试过,应该说如果对方断线的话,那服务器在调用SOCKET命令时应该会返回SOCKET_ERROR(应该是这样吧),再根据WSAGetLastError()应该就可以做相应的判断。
      

  5.   

    OnClose事件是软关机
    关闭电源是硬件关机,当然不行
      

  6.   

    Socket是不能检测到突然关机,网线断的情况的,如要检测有两种方法:1,服务端socket设置keepalive属性,用setsockopt。2,服务端不停和客户端交换信号,来检测线路状态。
      

  7.   

    单独使用keepalive属性好像不行!还是需要超时判断的!
    这个问题一直在讨论,到现在我还没有看到特别好的方法呢 :(->  这样我的服务器在给他发信就导致了服务器程序崩溃
    竟然能崩溃!!!用什么操作系统?
      

  8.   

    不好意思,最近忙于考试,没想到此处还很热闹,非常感谢各位光顾,: superblackice sdf123321两位不知是谁抄谁的,不过无所谓好东西要大家共享嘛!给分了!