有看到说用心跳包来做,这要怎么做呢?请大家给点意见,或者思路.还有server端移到无信号的位置,也要很快就能检测到断线,不然数据会丢失.

解决方案 »

  1.   

    就是每隔一段时间发一个包出去,对方回复,如果无回复断线
    你也可以直接用socket的keepalive属性,它都帮你封装好了
      

  2.   

    1. TCP协议在协议当中已经处理了丢包重发,在应用层可以认为是可靠的。
    2. 之所以需要心跳包,是因为在异常断开的情况下系统检查出断线状态所需要的时间相当长,最长达4分钟,这对于应用程序是无法容忍的,所以就通过自定义心跳包的机制来实际断线检测,也正因为连接的异常检测需要相当长的时间,为了防止设置不当的心跳间隔,而最好增加一定复杂度的判断逻辑。    ////这样判断超时
    int Send(const char* pch, const int nSize, const int nSecs)
    {
    FD_SET fd = {1, m_hSocket};
    TIMEVAL tv = {nSecs, 0};
    if(select(0, NULL, &fd, NULL, &tv) == 0)
    {
    //timeout
    }
    int nBytesSent = 0;
    if((nBytesSent = send(m_hSocket, pch, nSize, 0)) == SOCKET_ERROR) {
    //error
    }
    return nBytesSent;
    }超时时间自己设 还可以发送三次探测数据包  等待回应 一定时间内没有回应则认为掉线唯一, 我不确定的就是超时时间了,网络复杂啊
      

  3.   

    拙见:
    1.可用楼2的select模型,直接在select(...)函数中设置超时时间;
    2.也可用WSAAsynSelect/WSAEventSelect + WSAWaitForMultipleEvents模型,在WSAWaitForMultipleEvents(...)中设置超时值;
    3.还可用Overlapped I/O事件通知模型,在WSAWaitForMultipleEvents(...)中设置超时值。
    因为你即要在客户端判断是否断线了,又要在服务端判断,这两种环境是有区别的,尤其在连接数目上。以上模型各有优缺点,根据不同的环境选择合适的方案吧。
      

  4.   

    可以检测Socket号是否还存在,每个连接都有一个Socket号的