Socket 하트비트 메커니즘

4206 단어
심장 박동 패킷의 발송은 일반적으로 두 가지 기술 방법이 있다. 1: 응용 층이 자체적으로 실현한 심장 박동 패킷은 응용 프로그램이 스스로 심장 박동 패킷을 보내서 연결이 정상적인지 검사하는 것이다. 대체적인 방법은 서버가 하나의 Timer 이벤트에서 클라이언트에게 짧고 강력한 데이터 패킷을 보내고 낮은 단계의 라인을 시작하여 이 라인에서 클라이언트의 응답을 끊임없이 검사하는 것이다.만약 일정 시간 내에 클라이언트의 응답을 받지 못하면 클라이언트가 이미 오프라인 상태라고 생각한다.마찬가지로 클라이언트가 일정 시간 동안 서버의 하트비트 패키지를 받지 못하면 연결을 사용할 수 없다고 생각합니다.
방법 2: TCP의 Keepalive 활성화 메커니즘은 한 서버에 여러 개의 클라이언트가 연결되는 것을 고려해야 하기 때문에 사용자가 응용 층에서 스스로 심장 박동 패키지를 실현하는데 코드가 비교적 많고 약간 복잡하지만 TCP/IP 프로토콜 층이 내장된 Keepalive 기능을 이용하여 심장 박동 기능을 실현하는 것은 훨씬 간단하다.서비스 측이든 클라이언트든 한쪽은 Keep Alive 기능을 켜면 정해진 시간에 상대방에게 심장 박동 패키지를 보내고, 다른 한쪽은 심장 박동 패키지를 받은 후에 자동으로 답장을 해서 상대방에게 내가 여전히 온라인에 있다는 것을 알려준다.Keepalive 기능을 켜려면 추가 광대역과 데이터가 소모되기 때문에 TCP 프로토콜 층은 기본적으로 Keepalive 기능을 켜지 않습니다. 비록 이것은 보잘것없지만 데이터에 따라 비용을 계산하는 환경에서 비용을 증가시켰습니다. 한편, Keepalive 설정이 불합리할 때 짧은 네트워크 파동으로 인해 건강한 TCP 연결을 끊을 수 있습니다.또한 기본 Keepalive 제한 시간은 7200000MilliSeconds, 즉 2시간이며 탐지 횟수는 5회입니다.많은 서버 응용 프로그램에 있어서 2시간의 여가 시간이 너무 길다.따라서 Keepalive 기능을 수동으로 켜고 합리적인 Keepalive 매개 변수를 설정해야 합니다.이상에서 네트워크로 전환합니다.
심박수 패키지 메커니즘이 심박수 패키지라고 하는 이유는 심박수처럼 고정된 시간에 한 번씩 보내서 서버에 이 클라이언트가 살아있다는 것을 알려주기 때문이다.사실 이것은 긴 연결을 유지하기 위해서이다. 이 가방의 내용은 특별한 규정이 없지만 일반적으로 매우 작은 가방이나 가방 머리만 포함된 빈 가방이다.TCP의 메커니즘 안에서 그 자체는 심장박동이 있는 메커니즘이 존재한다. 즉, TCP의 옵션: SO_KEEPALIVE.시스템은 기본적으로 설정된 2시간의 심장 박동 주파수입니다.그러나 기계의 단전, 네트워크 뽑기, 방화벽 등 단선을 검사할 수 없다.그리고 논리층 처리 단선도 그렇게 잘 처리되지 않을 수도 있다.일반적으로 단지 생존을 보장하는 데 쓰인다면 그래도 된다.심장 박동 패키지는 일반적으로 논리층에서 빈 에코 패키지를 보내서 이루어진다.다음 타이머는 일정한 시간 간격으로 클라이언트에게 빈 패키지를 보내고 클라이언트가 똑같은 빈 패키지를 피드백해서 돌아온다. 서버가 일정 시간 안에 클라이언트가 보낸 피드백 패키지를 받지 못하면 오프라인이라고 인정할 수밖에 없다.사실, 오프라인 판정을 하려면send나recv만 필요하고, 결과가 0이면 오프라인입니다.그러나 긴 연결에서 오랫동안 데이터 왕래가 없을 수도 있다.이론적으로 말하자면 이 연결은 줄곧 연결을 유지하지만 실제 상황에서 중간 노드에 어떤 고장이 발생하면 알 수 없다.더 심각한 것은 어떤 노드(방화벽)는 일정 시간 동안 데이터 상호작용이 없는 연결을 자동으로 끊어버리는 것이다.이럴 때는 우리의 심장 박동수가 필요하다. 긴 연결을 유지하고 활력을 유지하는 데 쓰인다.끊어진 것을 알게 된 후에 서버 논리는 몇 가지 일을 해야 할 수도 있다. 예를 들어 끊어진 데이터의 정리, 다시 연결이야... 물론 이것은 논리층이 수요에 따라 해야 한다.전반적으로 말하면 심장 박동백은 주로 긴 연결의 보존과 단선 처리에 쓰인다.일반적인 응용에서 판정 시간은 30-40초가 비교적 좋다.만약 정말 요구가 높다면, 그것은 6-9초이다.
심박수 감지 단계: 1 클라이언트가 한 시간 간격으로 하나의 탐지 패키지를 서버에 발송할 때 시간 초과 타이머를 시작합니다. 3 서버 쪽에서 감지 패키지를 수신하면 응답해야 합니다. 4 클라이언트가 서버의 응답 패키지를 받으면 서버가 정상이고 시간 초과 타이머를 삭제합니다. 5 클라이언트의 시간 초과 타이머가 시간을 초과해도 응답 패키지를 받지 못하면 서버가 종료됩니다.http://blog.sina.com.cn/s/blog_a459dcf5010153m5.html위에서 소개한 바와 같이 우리는 대단이 우아하지 않은 방식으로 연결을 끊을 때 SO_를 설정할 수 있음을 알 수 있다KEEPA LIVE 속성으로 인해 2시간 후에 상대방의 TCP 연결이 여전히 존재하는지 알 수 있습니다.구체적인 작업://Keepalive 1,
BOOL   bKeepAlive   =   TRUE;       
  int nRet=::
setsockopt(sockClient,SOL_SOCKET,SO_KEEPALIVE,(char*)&bKeepAlive,sizeof(bKeepAlive));  
       if(nRet!=0)        {            
 AfxMessageBox(" ");  
       return   ;   
 }            
2、 1 // KeepAlive        
  tcp_keepalive    inKeepAlive   =   {0};   //         
 unsigned   long   ulInLen   =   sizeof(tcp_keepalive );             
    tcp_keepalive    outKeepAlive   =   {0};   //         
 unsigned   long   ulOutLen   =   sizeof(tcp_keepalive );              
   unsigned   long   ulBytesReturn   =   0;            
 // socket keep   alive 10 , 3         
 inKeepAlive.onoff   =   1;           
inKeepAlive.keepaliveinterval   =   4000;  
 // KeepAlive          
inKeepAlive.keepalivetime   =   1000;   
// KeepAlive TCP              
nRet=WSAIoctl(sockClient,               
SIO_KEEPALIVE_VALS,             
(LPVOID)&inKeepAlive,             
ulInLen,             
(LPVOID)&outKeepAlive,             
ulOutLen,     &ulBytesReturn,        NULL,             NULL);       
 if(SOCKET_ERROR   ==   nRet)         {          
   AfxMessageBox(" ");      
  return;      
  }  
 3、 2     
int                 keepIdle = 6;   
 int                 keepInterval = 5;    
int                 keepCount = 3;   
 Setsockopt(listenfd, SOL_TCP, TCP_KEEPIDLE, (void *)&keepIdle, sizeof(keepIdle));    
Setsockopt(listenfd, SOL_TCP,TCP_KEEPINTVL, (void *)&keepInterval, sizeof(keepInterval));    
Setsockopt(listenfd,SOL_TCP, TCP_KEEPCNT, (void *)&keepCount, sizeof(keepCount));

자세한 내용:http://blog.csdn.net/gavin1203/article/details/5290609setsockopt 작업에 대한 자세한 내용은 다음과 같습니다.http://www.cnblogs.com/hateislove214/archive/2010/11/05/1869886.html

좋은 웹페이지 즐겨찾기