我用 winsocket api 来做,服务器端开线程不同的 accept,可以及时得到客户端的连接,但不知道怎么才能得到客户端已经断开连接了

解决方案 »

  1.   

    不知道 TServerSocket 控件是怎么实现的。我还是自己去看看源码
      

  2.   

    socket 认为 recv 返回 = 0 就是 socket 正常断开了, 所以一般要 if recv(...) = 0 then closesocket(...)
    也有非正常断开的情况,这个就不能判断, 只有在下一个 socket send 发生时,socket 返回一个出错代码才能得知,对于网络条件很差时是很常发生的,这时应该给socket设一个超时,有保持连接需要的在超时后发一个心跳
      

  3.   

    MIDAS中的服务端SCKTSRVR和客户端的SOCKTCONNECTION也是这样的问题,当客户端断网了,这时服务端的连接还在哪里。不知在DELPHI2007中的SCKTSRVR是不是解决了这个问题。comanche ,能不能给个例子呀,怎样socket设一个超时,有保持连接需要的在超时后发一个心跳。
      

  4.   

    如果用TServerSocket的话,你会头疼很多,比如意外断开等等,都会报错.
    必须在其事件属性加上Errcode : =0.心跳发包也可以,判断socket是否invalid_socket 不是太准.
      

  5.   

    你用的是tcp吧,api提供的有与accept对应的Close函数吧,再开一个线程,接收close消息,当客户端断开连接里会触发Close
      

  6.   

    recv返回0就是断开了,对,当你在用Recv开始接收数据的时候,如果返回0 就表示断开连接了。
      

  7.   

    用 recv 的返回值确实可以,谢谢大家