Протоколы Internet




Транспортный протокол реального времени RTCP - часть 21


Расширения SR/RR. Секция расширения может быть определена для RTCP SR и RR пакетов, если имеется дополнительная информация о получателе или отправителе, которая должна регулярно передаваться.

Проверка корректности заголовка RTCP

Пакеты RTCP подвергаются следующим проверкам.

  • RTP поле версии должно быть равно 2.
  • Поле типа данных первого RTCP пакета в составном пакете должно быть SR или RR.
  • Бит заполнителя (P) должен быть равен нулю для первого пакета составного RTCP пакета, так как заполнитель может присутствовать только в последнем.
  • Длина полей индивидуальных RTCP-пакетов должна в сумме равняться полной длине составного пакета.
  • Фрагмент приведенной ниже программы выполняет все рассмотренные проверки (текст взят из ссылки, приведенной в начале раздела). Тип пакета для последующих пакетов не проверяется, так как не известный тип пакета должен игнорироваться.

    u_int32 len; /* Длина составного RTCP пакета в словах */

    rtcp_t *r; /* заголовок RTCP */

    rtcp_t *end; /* Конец составного RTCP пакета */

    if ((*(u_int16 *)r & RTCP_VALID_MASK) != RTCP_VALID_VALUE) {

    /* что-то не в порядке с форматом пакета */

    }

    end = (rtcp_t *)((u_int32 *)r + len);

    do r = (rtcp_t *)((u_int32 *)r + r->common.length + 1);

    while (r < end && r->common.version == 2);

    if (r != end) {

    /* что-то не в порядке с форматом пакета */

    }

    Генерирование пакетов SDES RTCP

    Эта функция формирует фрагмент SDES, состоящий из элементов argc, взятых из массивов type, в буфере b.

    char *rtp_write_sdes(char *b, u_int32 src, int argc,

    rtcp_sdes_type_t type[], char *value[],

    int length[])

    {

    rtcp_sdes_t *s = (rtcp_sdes_t *)b;

    rtcp_sdes_item_t *rsp;

    int i;

    int len;

    int pad;

    /* SSRC header */

    s->src = src;

    rsp = &s->item[0];

    /* SDES items */

    for (i = 0; i < argc; i++) {

    rsp->type = type[i];

    len = length[i];

    if (len > RTP_MAX_SDES) {

    /* неверная длина, возможно нужны другие действия */

    len = RTP_MAX_SDES;

    }

    rsp->length = len;

    memcpy(rsp->data, value[i], len);




    Содержание  Назад  Вперед