我正在实施UDP视频重定向功能。理想情况下,应处理传入的视频数据包并将其重定向到指定的输出接口(eth0或eth1)。以下是它的实现方式:
用户从webui中选择界面。接口传递给后端
使用OpenCaster套件(here)处理视频数据包。正在使用以下库来处理数据包: tsfixcc,tsdiscont,tsvbr2cbr,tstimedwrite,tspcrrestamp和tsudpsend。
我按如下方式修改tsudpsend以支持将套接字绑定到特定接口,并且没有编译错误,我认为它工作正常。
的
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
有关为何发生这种情况的任何建议或想法?有什么建议吗?