RTSP, RTP 및 RTCP 포트 번호 설정

1. RTSP 포트 번호 설정
RTSP 포트 번호를 설정하는 작업은 ARTSPConnection에 있습니다.cpp 파일에서 먼저 URL에서 포트 번호를 가져옵니다. 읽지 못하면 기본 포트 554로 설정합니다.코드 처리는 다음과 같습니다.
ARTSPConnection::ParseURL(

    const char *colonPos = strchr(host->c_str(), ':');

    if (colonPos != NULL) {
        unsigned long x;
        if (!ParseSingleUnsignedLong(colonPos + 1, &x) || x >= 65536) { // rtsp      65536
            return false;
        }

        *port = x;

        size_t colonOffset = colonPos - host->c_str();
        size_t trailing = host->size() - colonOffset;
        host->erase(colonOffset, trailing);
    } else {
        *port = 554; //    url       ,       554
    }
--------------------------------------------------------------------------------------------------------
2. RTP 및 RTCP 포트 번호 설정
RTP 및 RTCP 포트 번호를 설정하는 작업은 ARTPConnection에 있습니다.cpp 파일의 RTSP 포트 번호 설정과 처리는 각각 다른 파일에 있습니다.(1) 함수 선언: 인접 포트 쌍에 대한 UDP 데이터 보고서 소켓을 생성합니다.rtp 플러그인은 짝수 포트입니다. rtcp 플러그인 포트는 rtp 포트 번호보다 한 번호가 큽니다.
4
    // Creates a pair of UDP datagram sockets bound to adjacent ports
    // (the rtpSocket is bound to an even port, the rtcpSocket to the
    // next higher port).
    static void MakePortPair(
            int *rtpSocket, int *rtcpSocket, unsigned *rtpPort);
(2) 함수 정의: RTP 및 RTCP 포트 설정
// static
void ARTPConnection::MakePortPair(
        int *rtpSocket, int *rtcpSocket, unsigned *rtpPort) {
    *rtpSocket = socket(AF_INET, SOCK_DGRAM, 0);
    CHECK_GE(*rtpSocket, 0);

    bumpSocketBufferSize(*rtpSocket);

    *rtcpSocket = socket(AF_INET, SOCK_DGRAM, 0);
    CHECK_GE(*rtcpSocket, 0);

    bumpSocketBufferSize(*rtcpSocket);

    unsigned start = (rand() * 1000)/ RAND_MAX + 15550; //       15550
    start &= ~1; //  1         ,    start    ,       

    for (unsigned port = start; port < 65536; port += 2) { // rtp      65535,  rtcp    65536
        struct sockaddr_in addr;
        memset(addr.sin_zero, 0, sizeof(addr.sin_zero));
        addr.sin_family = AF_INET;
        addr.sin_addr.s_addr = htonl(INADDR_ANY);
        addr.sin_port = htons(port);

        if (bind(*rtpSocket,
                 (const struct sockaddr *)&addr, sizeof(addr)) < 0) {
            continue;
        }

        addr.sin_port = htons(port + 1);

        if (bind(*rtcpSocket,
                 (const struct sockaddr *)&addr, sizeof(addr)) == 0) {
            *rtpPort = port;
            return; //   rtcp     
        }
    }

    TRESPASS();
}

좋은 웹페이지 즐겨찾기