Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从多播流中计算RTP序列号_C_Sockets_Multicast_Rtp - Fatal编程技术网

C 从多播流中计算RTP序列号

C 从多播流中计算RTP序列号,c,sockets,multicast,rtp,C,Sockets,Multicast,Rtp,我试图从多播流中计算RTP序列号并确定丢失的包 请参阅以下C代码: int sock, bytesRead; char buffer[MAXBUFSIZE]; uint16_t seq = 0; uint16_t eseq = 0; struct sockaddr_in saddr; socklen_t socklen; for(;;) { bytesRead = recvfrom(sock, buffer, MAXBUFSIZE, 0,

我试图从多播流中计算RTP序列号并确定丢失的包

请参阅以下C代码:

int sock, bytesRead;
char buffer[MAXBUFSIZE];
uint16_t seq = 0;
uint16_t eseq = 0;
struct sockaddr_in saddr;
socklen_t socklen;

    for(;;) {
        bytesRead = recvfrom(sock, buffer, MAXBUFSIZE, 0,
                             (struct sockaddr *)&saddr, &socklen);
        if (bytesRead) {
            seq = (buffer[2] << 8)+buffer[3];
            eseq++;
            if (seq != eseq) {
                std::cerr << " SEQ = " << seq << " ESEC = " << eseq << "\n";
                eseq = seq;
            }
        }
    }
每个
128
RTP包都会出现错误,正如您所看到的
|ESEC-SEQ |=256
,我还删除了RTP头并将数据写入文件.mpg,视频播放良好,没有错误和伪影。


请解释如何正确计算多播流中的RTP序列号

由于缓冲区是
有符号字符
数组,您的转换(左移)溢出。是的

您可以使用以下代码示例测试/解决此问题:

#include <stdio.h>
#include <stdint.h>

int main()
{
    uint16_t seq1;
    uint16_t seq2;
    uint16_t seq3;

             char buffer1[] = {0, 0, 0xE8, 0x80};
    unsigned char buffer2[] = {0, 0, 0xE8, 0x80};

    seq1 = (buffer1[2] << 8)+buffer1[3];
    printf("seq1: %d\n", seq1);

    seq2 = (buffer2[2] << 8)+buffer2[3];
    printf("seq2: %d\n", seq2);

    seq3 = buffer1[2];
    seq3 = (seq3 << 8)+buffer2[3];
    printf("seq3: %d\n", seq3);

    return 0;
}
正如您可以看到的,使用
有符号字符
seq1
)缓冲区时,转换是错误的。 该示例显示了您发布的最后一行结果发生了什么。

它不是代码。此
(缓冲区[2]
#include <stdio.h>
#include <stdint.h>

int main()
{
    uint16_t seq1;
    uint16_t seq2;
    uint16_t seq3;

             char buffer1[] = {0, 0, 0xE8, 0x80};
    unsigned char buffer2[] = {0, 0, 0xE8, 0x80};

    seq1 = (buffer1[2] << 8)+buffer1[3];
    printf("seq1: %d\n", seq1);

    seq2 = (buffer2[2] << 8)+buffer2[3];
    printf("seq2: %d\n", seq2);

    seq3 = buffer1[2];
    seq3 = (seq3 << 8)+buffer2[3];
    printf("seq3: %d\n", seq3);

    return 0;
}
seq1: 59264
seq2: 59520
seq3: 59520