Socket 하트비트 메커니즘
방법 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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.