网络编程工程实训_实验四 使用Libpcap库将离线文件转换为TS文件

实验任务:

使用前期搭建好的开发环境(Centos7.0+gcc+libpcap),使用C/C++语言开发一个应用程序,打开虚拟机网卡(与物理主机在同一个子网的)设备,将离线文件中的数据包进行解析,去除协议层头部,仅保留应用层数据,保存为TS文件(扩展名为ts)。

实验内容:

1.使用libpcap库的pcap_t *pcap_open_offline(const char *fname, char *errbuf)函数,打开离线文件(离线文件以绝对路径的做为第一个参数,保存出错信息的字符串做为第二个参数,返回一个设备指针),并根据打开成功与否,打印“Hello+你的姓名!”(成功)或“Sorry+你的姓名!”(失败)。
2.使用上一步中获取的设备,采用以下两种方法其一,将离线抓包文件经过解析处理,提取应用层数据保存为ts文件,名称为:学号+姓名.ts。
使用while死循环和pcap_next()或pcap_next_ex()对抓包数据进行解析,并去除PDU头部。
使用pcap_loop()和自定义回调函数来进行数据包解析,去除各层PDU头部,对数据包的解析和头部处理操作均放在回调函数中。
3.针对你得到的ts文件,使用VLC播放器进行播放,如果能够正常播放,则数据提取成功。
4.使用Elecard StreamEye Tools(前期已经提供给大家)打开解析提取出的ts文件,查看TS文件中,节目流的数目及相应的PID,在实验报告中记录下来。
实验过程填写要求:对以上3项内容,写出详细步骤,并将每一层解析的结果抓图放入报告中。

实验过程:

1.在Documents下新建mywork文件夹,新建ex3.c,输入如下代码:
使用fopen(文件名,使用文件方式)以便最后将文件保存下来;
其中文件名必须说明为FILE类型的指针变量,使用文件方式是指文件的类型和操作要求。
网络编程工程实训_实验四 使用Libpcap库将离线文件转换为TS文件_第1张图片
网络编程工程实训_实验四 使用Libpcap库将离线文件转换为TS文件_第2张图片
网络编程工程实训_实验四 使用Libpcap库将离线文件转换为TS文件_第3张图片

使用fwrite()将数据写入1.ts。
对fwrite(),第一个参数指向要被写入的元素数组的指针;第二个是被写入的每个元素的大小,字节为单位;第三个是元素的个数,单位也是字节;第四个参数是指向FILE对象的指针,它指定了一个输出流。
网络编程工程实训_实验四 使用Libpcap库将离线文件转换为TS文件_第4张图片
(1)使用pcap_open_offline()函数打开离线包,打开成功则打印“Hello,周珊”。
(2)使用上一步中获取的设备,使用pcap_loop()和自定义回调函数来进行数据包解析,将离线抓包文件经过解析处理,提取应用层数据保存为ts文件。
网络编程工程实训_实验四 使用Libpcap库将离线文件转换为TS文件_第5张图片
2.终端里片段输出结果为
网络编程工程实训_实验四 使用Libpcap库将离线文件转换为TS文件_第6张图片

3.在同目录下出现XXX.ts
网络编程工程实训_实验四 使用Libpcap库将离线文件转换为TS文件_第7张图片
CentOS里的属性:
在这里插入图片描述
4.拖到物理机上
5.使用VLC打开(视频清晰流畅)
6.使用Elecard StreamEye Tools打开解析提取出的ts文件,查看TS文件
网络编程工程实训_实验四 使用Libpcap库将离线文件转换为TS文件_第8张图片

6.实验感想
本次实验在上次实验的基础上加上fopen() 和fwrite()两个函数,将抓取的TS流输出为文本,再在物理机上使用VLC打开。实验过程中,寻找两个函数和将函数写入代码花费比较长的时间,过程中遇到只抓到部分TS流,抓完TS流在VCL里却打不开等等情况,在一一排错后,VCL里成功播放,试验成功。

附录:

函数pcap_next()的使用说明:
const u_char *pcap_next(pcap_t *p, struct pcap_pkthdr *h);
pcap_next()
参数:p: 已打开的捕捉实例的描述符
h: 报文头
返回值:成功则返回指向数据包的指针;
出错则返回控指针,抓包出错,从网卡上抓不到包(包由于过滤条件都被丢弃了。超时了,抓包句柄指向的网卡不支持堵塞模式并且没有不论什么包经过该网卡)。

函数pcap_next_ex()的使用说明:
pcap_next_ex(pcap_t* p,struct pcap_pkthdr** pkt_header,const u_char** pkt_data)
功能: 从interface或离线记录文件获取一个报文
参数: p: 已打开的捕捉实例的描述符
pkt_header: 报文头
pkt_data: 报文内容
返回值: 1: 成功
0: 获取报文超时
-1: 发生错误
-2: 获取到离线记录文件的最后一个报文

函数pcap_loop()的使用说明:
int pcap_loop(pcap_t * p,int cnt, pcap_handler callback, uchar * user);
第一个参数是会话句柄,
第二个参数是pcap_loop()在返回前应捕捉多少个数据包。
第三个参数是回调函数的名称(不包含括号)。
第四个参数,用户向回调函数传递的参数,

你可能感兴趣的:(操作部分,笔记类,网络编程工程实训,C语言)