在项目四中,我们完成了从离线文件中抓取数据包然后还原出TS流文件的任务,那么这次我们就来实现从实时在线的数据流中抓取数据流文件,然后从嘈杂的在线环境中过滤出含TS流数据的数据包,并将数据写进文件中进行播放。
在本项目中,我使用Winsend软件从物理主机(Windows10)发送数据包到虚拟机(CentOS7),在虚拟机中运行抓包程序,将含有TS数据流的文件写入文件中,最后使用VLC播放器进行播放。
本项目的难点就是如何在嘈杂的网络环境中抓到TS流文件,方法就是设置过滤包条件,在我的VMnet8网卡所在的网络环境下,传送的数据包包括以下几种协议:以太网帧,IPV4,UDP,然后就是数据了,所以我设置的过滤条件就是首先是IPV4协议,然后使用UDP协议且数据开头为0x47(TS流文件数据一定是以0x47开头),满足这样条件的数据包中的数据才会被写进文件中。
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <pcap.h>
#include <time.h>
#include <unistd.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netinet/if_ether.h>
#include <linux/ip.h>
#include <linux/tcp.h>
#include <linux/udp.h>
#include "PPPoE.h"
//全局变量文件指针fp
FILE *fp;
//将TS流数据写进文件
void write_ts_file(int j,int len,const u_char *packet){
while(j < len){
if(fwrite(&