UDP使用套接字进行休息,导致NULL数据包

时间:2016-12-16 21:40:28

标签: c linux sockets udp video-streaming

我正在实施UDP视频重定向功能。理想情况下,应处理传入的视频数据包并将其重定向到指定的输出接口(eth0或eth1)。以下是它的实现方式:

  1. 用户从webui中选择界面。接口传递给后端

  2. 使用OpenCaster套件(here)处理视频数据包。正在使用以下库来处理数据包: tsfixcc,tsdiscont,tsvbr2cbr,tstimedwrite,tspcrrestamp和tsudpsend。

  3. 我按如下方式修改tsudpsend以支持将套接字绑定到特定接口,并且没有编译错误,我认为它工作正常。

  4. int main (int argc, char *argv[]) {
        char *opt;
        opt = argv[5];
        sockfd = socket(AF_INET, SOCK_DGRAM, 0);
        if(sockfd < 0) {
            perror("socket(): error ");
            return 0;
        }
    
        struct ifreq ifr;
        memset(&ifr, 0, sizeof(ifr));
        strcpy(ifr.ifr_name, opt);
        if (ioctl(sockfd, SIOCGIFINDEX, &ifr)<0){
            fprintf(stderr,"ioctl(): error ");
        }
    
        if (setsockopt(sockfd, SOL_SOCKET, SO_BINDTODEVICE, opt, strlen(opt))>0){
            fprintf(stderr,"setsock(): error ");
        }
    
        fprintf(stderr, "The bind is done on interface %s \n", opt);
        fprintf(stderr, "opt length is %zu \n", strlen(opt));
        if (setsockopt(sockfd, SOL_SOCKET, SO_BINDTODEVICE, (void *)&ifr, sizeof(ifr)) < 0) {
            fprintf(stderr,"Server-setsockopt() error for SO_BINDTODEVICE");
            close(sockfd);
            return 1;
        }
    
        return 0;
    }
    

    问题:当我在所选接口(eth0或eth1)上执行数据包捕获时,处理后的数据包为NULL数据包而不是视频数据包,如下所示

    1054354 1127.215289 192.168.78.196 -> 239.1.1.1    MPEG TS 1358 NULL packet
    1054355 1127.216366 192.168.78.196 -> 239.1.1.1    MPEG TS 1358 NULL packet
    1054356 1127.217405 192.168.78.196 -> 239.1.1.1    MPEG TS 1358 NULL packet
    1054357 1127.218462 192.168.78.196 -> 239.1.1.1    MPEG TS 1358 NULL packet
    1054358 1127.219549 192.168.78.196 -> 239.1.1.1    MPEG TS 1358 NULL packet
    

    有关为何发生这种情况的任何建议或想法?有什么建议吗?

0 个答案:

没有答案