服务器异常退出(断电,网线断了),客户端还在recv那里等待接收数据,
请问如何使客户端立即判断出服务器已退出。我的recv是在一个线程中。

解决方案 »

  1.   

    我用异步的,监听FD_CLOSE以及一个怪数字的消息退出~
      

  2.   

    不是很明白,能不能说清楚点。FD_CLOSE你是用了什么模型吗?
      

  3.   

    我现在的状况是,服务器退出了。但我的客户端还在recv这里阻塞。
      

  4.   

    服务器异常退出(断电,网线断了),recv函数会返回失败用WSAGetLastError函数获取返回值判断
      

  5.   

    难道你的recv没有判断返回值?
      

  6.   

    服务器退出后,recv一直处于等待接收的状态,根本就没有返回一个数值啊
      

  7.   

    setsocketopt(), 把timeout的参数设置一下,别在那里等到地球爆炸,recv()等个几秒几十秒也就行了
      

  8.   

    加心跳吧,服务器物理网络断掉的话,recv是会一直不退出的
      

  9.   

    楼主,要搞清这个问题,你近几年内只有这一次机会,请看:当对等方断开连接,情况会有以下2种情况: 
    1  软件断开:这种情况,对等放会发来FIN,所以recv函数会返回,并返回0。
    2  物理断开:这种属于灾难性,比如海底光缆被大白鲨咬断了等等。你的recv函数不会有任何响应,45分钟后,它将返回一个错误,这是TCP保活定时器产生的事件。如何知道,对等方已经断开了呢? 保险的方法只有心跳包,定时发送,并接受心跳包,一旦超时不到,就断开连接,并回收资源。不要胡思乱想,这是唯一的办法。
      

  10.   

    先设置recv和send的超时时间,然后用select判断有数据可读的时候再读取。如果能加上心跳的功能就最好了。
      

  11.   

    判断recv函数会返回值,如果发送速度快,可能就不好用了
      

  12.   

    为什么不用ping,加个定时器,或者设置你的应用层收不到数据就ping一次目标机,当目标机断网或断点就ping不通。
    用recv的话,如果目标机网络正常,而应用层没有数据发送时不也返回-1吗?怎么判断目标机异常啊?!