基于Gstreamer框架的smooth streaming协议的插件开发 - 图文(6)

2020-04-16 12:21

基于GStreamer的Smooth Streaming插件开发

⑸trun。该box中存放的为该Fragment数据中每个sample的大小、偏移时间、持续时间和属性设置。

⑹sdtp。该box中没有内容,只是用来表示源数据的结束。

⑺mdat。该box为一个单独的数据box,主要存储该Fragment数据中的所有sample数据内容。

第四章 基于GStreamer的Smooth Streaming协议的插件开发

4.1 socket通信协议设计实现 4.1.1 socket的概念

Socket是建立在传输层协议(主要是TCP与UDP)上的一种套接字规范,最初是由美国的加州Berkley大学提出,为UNIX系统开发的网络通信接口。它定义了两台计算机之间通信的规范,socket屏蔽了底层通信元件和具体操作系统的差异,使得任意两台安装了TCP协议软件和实现了socket规范的计算机之间的通信成为可能。发展至目前,socket网络接口已经发展成为TCP/IP网络最为通用的网络接口。

4.1.2 socket的分类

Linux系统支持多种套接字类型,主要有以下3 种:

1)流式套接字(SOCK_STREAM): 这是最常用的套接字类型。TCP 协议使用此类接口,它提供面向连接的、无差错的网络信息包的传输。

2)数据报套接字(SOCK_DGRAM):UDP协议使用此类接口,它是无连接的服务,以独立的数据报进行网络传输。数据报的最大长度为32KB,传输不保证顺序性、可靠性和无重复性,它通常用于单个报文传输或可靠性不重要的场合。

3)原始套接字(SOCK_RAW):提供对网络下层通信协议(如IP 协议)的直接访

27

基于GStreamer的Smooth Streaming插件开发

问,它一般不是提供给普通用户的,并主要用于开发新的协议或用于提取协议较隐蔽的功能。

4.1.3 socket的设计过程

套接字编程均采用客户机/服务器(C/S)的协作模式,即由客户进程向服务器进程发出请求,服务器进程执行被请求的任务并将响应结果返回给客户进程。本文构建的socket通信协议设计如图4-1所示:

图4-1 socket通信协议流程

4.1.4 非阻塞socket的设计过程

阻塞模式与非阻塞模式的最大区别在于当无请求时,阻塞模式会一直停留在函数中,而非阻塞模式则会根据实际的情况进行处理,特别是在接受数据或发送数据时。因为本文将要从服务器中下载比较大的数据,需要分批下载,要考虑到数据接受的完整性所以选用非阻塞方式。非阻塞方式的实现只是在阻塞模式下加

28

基于GStreamer的Smooth Streaming插件开发

入如下的设置即可:

1.调用fcntl()函数设置socket为非阻塞模式,具体调用如图4-2所示:

图4-2 fcntl函数调用方法

2.在read()和recv()函数中进行适当地处理判断处理,具体实现如图4-3所示:

图4-3 非阻塞recv函数实现

4.2 HTTP通信协议设计实现 4.2.1 HTTP相关概念

HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990 年提出,经过几年的使用与发展,得到不断地完善和扩展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的规范化工作正在进行之中,而且HTTP-NG(Next Generation of HTTP)的建议已经提出。

4.2.2 HTTP通信协议的特点

1.支持客户/服务器模式。

2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方

29

基于GStreamer的Smooth Streaming插件开发

法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。

3.灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type 加以标记。

4.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。

5.无状态:HTTP 协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

4.2.3 HTTP的URL格式分析

URL是一种特殊类型的URI,包含了用于查找某个资源的足够的信息的格式如下:

http://host[\

其中:http表示要通过HTTP协议来定位网络资源;host表示合法的Internet主机域名或者IP 地址;port 指定一个端口号,如果为空,则使用缺省端口80;abs_path 指定请求资源的URI;如果URL中没有给出abs_path,那么当它作为请求URI 时,必须以“/”的形式给出,通常这个工作浏览器自动帮我们完成。

4.2.4 HTTP通信协议设计

HTTP协议开发是在socket通信的基础上基于TCP的协议开发,因此,本文将HTTP协议开发分为:URL解析、socket创建、发送报头消息、获取响应报头消息和获取实体正文等五部分。

1.URL解析

为了得到输入URL地址中的主机名、端口号以及资源路径等相关信息,我们需要对其进行解析。本文根据实际情况设计了一个解析URL地址的函数如下所

30

基于GStreamer的Smooth Streaming插件开发

示:

int parse_url(char *url, char *server, int *port, char *path) 其中:传入参数url为输入的地址;传出参数server为主机名、port为端口号、path为资源相关路径。

2.socket创建

依据第一章中的客户端socket创建过程创建HTTP协议的socket。本文设计该socket创建函数如下所示:

int http_Socketcreate(char *hostaddr, int portnum)

其中:传入参数hostaddr为IP地址;传入参数portnum为端口号;返回值为创建成功的socket id。

3.发送报头消息

当客户端与服务器建立好连接后,此时客户端应该发送请求消息给服务器。本文设计了一个发送消息的函数如下所示:

int http_Send(int sockfd, char *request)

其中:传入参数sockfd为创建的客户端socket id;request为传入的请求消息。本文只涉及到HTTP中的GET方法,因此请求消息格式如下所示:

sprintf(request, \ Host: %s:%d\\r\\n

Connection: Keep-Alive\\r\\n\\r\\n\ host_file, host_addr, portnum);

其中:host_file为请求资源目录;host_addr为主机IP地址;portnum为通信端口号。添加打印信息可以看到发送的请求报头内容如图4-4所示:

图4-4 发送报头消息

4.获取响应报头消息

当服务器收到客户端的请求消息后,将会发送相关的响应报头信息和实体正文给客户端,让客户端获得实体正文的一些相关数据。本文设计了一个获取响应报头消息的函数如下所示:

31


基于Gstreamer框架的smooth streaming协议的插件开发 - 图文(6).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:GPS复习题

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: