вывести информацию о заголовке rtp, используя libpcap в cpp - PullRequest
0 голосов
/ 22 октября 2011

Я анализирую файл pcap с помощью libpcap.

Я хочу напечатать тип полезной нагрузки rtp & rtcp (96 для H264 / 0 для PCMU) (и также временную метку), чтобы я мог различить, является ли это аудио / видео.

Я могу печатать правильные порядковые номера пакетов rtp / rtcp, но не palyload.

typedef struct {

   unsigned int version:2;   /* protocol version */
   unsigned int p:1;         /* padding flag */
   unsigned int x:1;         /* header extension flag */
   unsigned int cc:4;        /* CSRC count */
   unsigned int m:1;         /* marker bit */
   unsigned int pt:7;        /* payload type */

       u_int16 seq;              /* sequence number */
       u_int32 ts;               /* timestamp */
       u_int32 ssrc;             /* synchronization source */
       u_int32 csrc[1];          /* optional CSRC list */
   } rtp_hdr_t;

rtp_hdr_t *rtphdr=(rtp_hdr_t *)(packet + sizeof(struct ether_header) +sizeof(struct ip_header) + sizeof(struct udp_header));

cout<< ntohs(rtphdr->pt) << endl;

Пример: получение типа полезной нагрузки 12288 и 0. Но мне нужно получить 96 и 0 (как в wireshark).

cout << ntohs(rtphdr->ts) << endl;

Пример: получение информации о временной метке похоже на 49892 (5-значное десятичное число) но я должен получить такие значения, как 3269770717.

Ответы [ 3 ]

1 голос
/ 23 октября 2011

Функция ntohs () преобразует короткое целое число без знака из порядка сетевых байтов в порядок байтов хоста.Обратите внимание, что это порядок байтов , поэтому для однобайтовой полезной нагрузки это преобразование не требуется.

Для отметки времени следует использовать ntohl () , посколькувы работаете с 32-битным значением.

Обновление Я думаю, это будет более естественным, чем использование полей:

typedef struct {
   u_int8 version_p_x_cc;
   u_int8 m_pt;
   u_int16 seq; 
   ....
}

// payload type:
cout<< rtphdr->m_pt & 0x7f << endl;
// marker bit
cout<< (rtphdr->m_pt >> 7) & 0x01  << endl;
0 голосов
/ 08 апреля 2014

Все дело в бесконечности.Итак, ваша структура должна соответствовать порядку байтов.

    struct rtpHeader {
#if __BYTE_ORDER == __BIG_ENDIAN
        //For big endian
        unsigned char version:2;       // Version, currently 2
        unsigned char padding:1;       // Padding bit
        unsigned char extension:1;     // Extension bit
        unsigned char cc:4;            // CSRC count
        unsigned char marker:1;        // Marker bit
        unsigned char payload:7;       // Payload type
#else
        //For little endian
        unsigned char cc:4;            // CSRC count
        unsigned char extension:1;     // Extension bit
        unsigned char padding:1;       // Padding bit
        unsigned char version:2;       // Version, currently 2
        unsigned char payload:7;       // Payload type
        unsigned char marker:1;        // Marker bit
#endif
        u_int16_t sequence;        // sequence number
        u_int32_t timestamp;       //  timestamp
        u_int32_t sources[1];      // contributing sources
};
0 голосов
/ 24 апреля 2012

Ну, вы написали битовое поле в порядке с прямым порядком байтов, но я думаю, что вы используете немного порядковый номер (Intel)И вы должны использовать uint16_t вместо вашего unsigned int.В конце концов, у вас есть только 16 битов.

...