이상 인터페이스는 문제에 대한 몇 가지 장애물 솔루션의 원인이 떨어 EasyRTSPServer 간단한, 멀티 플랫폼 지원 RTSP-Server 클라이언트 구성 요소를 호출

RTSP 프로토콜은 스트리밍 프로토콜 플레이 오디오 및 라이브 및 온 디맨드 형태의 비디오 스트리밍을 실현할 수 있습니다. RTSP 프로토콜은 서버의 다양한 정의 - 클라이언트 인터페이스 사이의 상호 작용을, 옵션, DESCRIBE, 설정, PLAY, TEARDOWN, RECORD가, 발표합니다. 네트워크에서 RTSP 프로토콜에 대해 기록 된 많은, 너무 많이 여기에 소개 할 준비가 아니에요. RTSP는 특정 데이터의 전송을 포함하지 않고,이 기능은 일반적으로 RTP 및 RTCP 프로토콜에 의해 실현되고, 하부 TCP 또는 UDP 전송 모드를 두 가지로 수행 될 수있다.

그림은 일반적인 RTSP 라이브 프로세스 서버입니다 - 클라이언트 차 상호 작용 과정 :

EasyRTSPServer 아키텍처 .PNG

EasyRTSPServer는 EasyRTSPServer 클라이언트의 방해로 이어지는 문제의 비정상적인 부분을 떨어 대해 안정적이고 효율적, 안정적, 멀티 플랫폼 지원 RTSP - 서버 구성 요소, 인터페이스가 당신과 함께 공유하는 오늘 매우 간단하고 정교한 전화입니다

질문 :

클라이언트가 비정상이기 때문에 리눅스 환경에서 EasyRTSPServer 지금도 액세스 할 수 없습니다 일부 채널의 결과로 삭제됩니다.

문제의 분석 :

분석 서버가 ​​디버깅 과정에서 CLOSE_WAIT을하고 있지만, 차단, 이벤트의 live555 호출 흐름의주의 깊은 분석을 찾을 수 있었다, 우리는 한 데이터가 클라이언트로부터 수신 한,이 GenericMediaServer ::대로 ClientSession :: noteLiveness를 실행합니다 발견 () 함수는 경우에 마지막으로 타임 아웃을 삭제 한 다음 스케줄러 큐에 타임 아웃 이벤트를 생성하고 클라이언트가 갑자기에서, 타임 아웃 작업을 호출이 작업에대로 ClientSession를 삭제할 것입니다 일반적으로 떨어졌다 갑자기 떨어 클라이언트 연결 (128)의 다수의 경우는, 기회 해제 할 수 없습니다 소켓을 주도 타임 아웃 이벤트없이 호출의 결과로, 거기 차단됩니다된다.

새 작업 시간 제한을 만드는 작업에 시간 제한의 파괴

void GenericMediaServer::ClientSession::noteLiveness() {

  if (fOurServerMediaSession != NULL) fOurServerMediaSession->noteLiveness();

  if (fOurServer.fReclamationSeconds > 0) {
		pEnvironment->taskScheduler().rescheduleDelayedTask(fLivenessCheckTask,
							  fOurServer.fReclamationSeconds*1000000,
							  (TaskFunc*)livenessTimeoutTask, this);
}
}

시간 초과 작업은 다음을 달성하기 위해

void GenericMediaServer::ClientSession::livenessTimeoutTask(ClientSession* clientSession) {
	delete clientSession;
}

플러스 인쇄 로그의 N 번호가 최종 분석는 epoll은 소켓에 recvfrom 장애물에 의한 호출이 이벤트이며,이 함수에서 적절한 핸들러를 호출 발견 ... 갑자기, 빠르게 무엇 SO_RCVTIMEO, 과연, live555의 모든 발견 코드는 해당 키워드를 검색 할 수 없습니다.

이 문제를 해결하려면

당신은 소켓을 생성 한 후, 데이터를 수신 할 수있는 제한 시간을 설정합니다.

#if defined(__WIN32__) || defined(_WIN32)
    DWORD msto = (DWORD)500;
    setsockopt(newSocket, SOL_SOCKET, SO_SNDTIMEO, (char *)&msto, sizeof(msto) );
    setsockopt(newSocket, SOL_SOCKET, SO_RCVTIMEO, (char *)&msto, sizeof(msto) );
#else
    struct timeval tv;
    tv.tv_sec = 0;
    tv.tv_usec = 500*1000;
    setsockopt(newSocket, SOL_SOCKET, SO_SNDTIMEO, (char *)&tv, sizeof tv);
    
    setsockopt(newSocket, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof tv);
#endif

추천

출처www.cnblogs.com/TSINGSEE/p/11685587.html