如题,最好不要再次发送连接请求等类似方法

解决方案 »

  1.   

    服务器关闭时,会有Close的事件发生
      

  2.   

    如果服务器端是正常的关闭socket退出,那么客户端马上就可以知道,你可以调用recv()去接收,马上就会返回一个错误码,告诉你远程主机已经关闭
    如果是非正常退出,没有调用closesocket(),那么客户端的socket就会存活一段时间,因为tcp有三次握手,它会定时的监测相连的socket是否还存活,它会定时的给对方发送ack包的,如果超过一定时间没有回答,就认为对方死掉了,所以,这种情况下你是没有办法立马知道对方异常的,中间要有个几秒的延迟,
      

  3.   

    没有专门函数
    当服务器closesocket
    客户端recv()长度为 0 由此来判断
      

  4.   

    如fndxm所说,如果是正常关闭,客户端能够捕获到相应的网络事件。
      

  5.   

    如果服务器端非正常退出(比如程序崩溃、死机、断电等),没有执行shutdown、closesocket,那么客户端可能永远(注意是永远!)不会知道!因为没有机会完成断开连接的4次(不是3次)握手(握手只是建立连接和断开连接时发生的,不是用于监测连接是否存活用的)因此,在设计协议时,大多要有检测机制,要么利用keepalive,要么自己发送心跳包。
      

  6.   

    TCP在连接的时候有三次握手机会。
    连接时:连接->ACK->ACK连接成功
    断开连接的时候也时这样的,在收到了ACK包后客户机断开连接,叫做完美释放。
    很多的关于TCP的文章都有此类的说明,建议去看看。