if(recv(client,buff,1024,0)==SOCKET_ERROR)
 }
    cout<<WSAGetLastError()<<endl;
    closesocket(client);
    accept();
}
利用心跳包判断 对方是否掉线
大于间隔时间算超时重新监听
用GetTickCount() 这个判断不知道怎么写

解决方案 »

  1.   

    这个重新连接一般是服务器直接中断Socket连接 即直接调用close函数 而不是超时  理论上  TCP不会超时
      

  2.   

    这个可以在一个客户端的结构体里面保存一个DWORD 时间  然后再枚举Socket的时候判断一下就可以了  当然 这个是简单的实现方法 
      

  3.   

    在一个新的线程中做循环,里面主要是Sleep和GetTickCount,如果GetTickCount得到的数值比上次得到的数值大xx时间,则closesocket
      

  4.   

    GetTickCount()减去一个时间 如果小于心跳包间隔时间 就关闭套接字
    我不懂 的是减去的是什么时间?怎么得到的
      

  5.   

    send 心跳包的时候通过GetTickCount()取得一个时间,可定义为TimeStart 开始时间
    心跳包发送后通过一个循环来不停的判断你发送心跳包后多少时间内没收到应答,就是用GetTickCount()减去TimeStart。如果WaitTime大于你的超时设置的时间,就可以认为超时了。如果在时间内收到,就认为没超时,跳出循环。然后下次发送心跳包同样处理
    TimeStart = GetTickCount();
    while(1)
    {
      WaitTime = GetTickCount() - TimeStart;
      Sleep(50) ;
    }
      

  6.   

    使用GetTickCount会存在隐患,如果程序连续运行40几天GetTickCount获取的DWORD会是个溢出值,那个时刻再与未溢出的值做减法会变成负数,而此负数也是小于心跳包间隔时间 ,但此时为合法数据。
      

  7.   

    我实现的主要是 客户端发送心跳包,服务端接收后在传回一个包,下面是我写的服务端接收包时超出心跳包间隔时间然后关闭套接字的代码,但运行后不正常,不知道这样
    检测心跳包超时是否正确?
    while (1)
    {
    stop:client=accept(ser,(SOCKADDR*)&clientaddr,&len);
               
       DWORD lngPassTime=0;
        while(lngPassTime<=3000)  //心跳包发送的间隔时间为2秒 
    {

    DWORD lngStartTime=GetTickCount();  
                            if(recv(client,buff,1024,0)==SOCKET_ERROR)
                            {
    cout<<WSAGetLastError()<<endl;
    closesocket(client);
    goto stop;
    }
    lngPassTime=GetTickCount()-lngStartTime;   
    cout<<buff<<endl;
    send(client,"收到!",strlen("收到")+1,0);
                     }
               closesocket(client);
       goto stop;
            }