本帖最后由 VisualEleven 于 2012-08-15 20:35:01 编辑

解决方案 »

  1.   

    能不能让客户端设个TIMER,定时发送消息给服务器,关闭的时候,就发送特殊消息。
      

  2.   

    你肯定写有接收该客户端的接口吧(即:::recv(socket1))。该函数的返回值就能够判断对方是否关闭。我记得是返回0时,表示对方是通过closesocket(socket1)的方式关闭了该套接字。如果返回-1的话,就需要使用getlasterror()来抓取到底是什么原因导致接收失败了。
    大体上就可以通过if(0 >= ::recv(socket1))来判断通信是否关闭了。
      

  3.   

    我想问问,能用FD_Close()这个事件吗?但是怎么知道是哪个套接字呢?
      

  4.   

    send返回0表示对方关闭了
    或者采用心跳包的方式,定时判断。
      

  5.   

    不同的socket模型有不同的方法,阻塞的模式就使用recv与send的返回值判断,如果是0就是网络出错,socket不能再使用,如果是异步模型查看每种模型的方法,例如完成端口就看GetQueuedCompletionStatus中的lpNumberOfBytesTransferred中的参数返回值,如果是0就是网络出错,socket不能再使用,至于是哪个socket每种模型响应时都会带有socket句柄做参数的,每次查询时那就是对应的socket句柄
      

  6.   

    长连接:心跳包是最科学的方法,一般都是自定义协议,在一段时间内发送一小端消息过去。
    一般服务器对每个连接都有个定时器,比如60秒之内收不到消息,服务器自动判定已断线,做相关处理
    短连接:这个判断就要重新Connect了,不需要心跳包