关键技术
在这个项目中,涉及到的关键技术有这些:
1、Epoll框架的设计与实现
2、网络传输协议的定义与实现
3、基于GTK的视频播放器设计
4、网络传输协议在播放器中的移植
下面我们将总结并回顾这几个关键技术
Epoll框架的设计与实现
Epoll是实现阻塞性IO和多路复用的一种技术,它能够同时监控许多文件是否可以读或者写,如果不能它将会进入阻塞,如果可以它将会唤醒对应的处理程序。这种处理方式大大简化了程序的设计难度,提高了CPU的利用效率。
Epoll的使用分为3个环节。
epoll_create/epoll_create1 (创建epoll监听池)
epoll_ctl (添加要监听的事件)
epoll_wait (等待事件的发生)
epoll需要监听的时间由这么一个结构来描述:
typedef union epoll_data{
void *ptr;
int fd;
__uint32_t u32;
__uint64_t u64;
};
struct epoll_event{
__uint32_t events;
epoll_data_t data;
};
events代表的是需要监听可读还是可写,data保存的是监听文件的信息,由于这个结构只能使用4个成员的一个,我们最好自己定义一个结构体,然后把结构体的地址赋值给ptr指针。
在我们的项目中需要监听这么几个事件:
1、摄像头文件可读(可以读取一副图片了)
2、socket文件可读
3、socket文件可写
摄像头文件的监控比较简单。对于socket文件的读写我们这样来实现,作为服务器,先判断是否收到了客户端的图片请求,如果收到了,则把图片发过去,否则阻塞。所以可以这样来编程实现:
1、初始化只添加socket可读事件(等待接收客户机的信息),不添加socket可写事件,因为只要socket没有被占用就一直可写,我们不需要主动的发送数据。
2、当socket收到数据时,在处理函数里面删除可读事件(防止读写混乱),添加可写事件(返回响应包)。
3、当可以通过socket发送数据时调用处理函数,在处理函数,我们等待数据发送完毕,发送完之后删除socket可写事件,添加socket可读事件。
为什么Epoll会这么高效呢?
这是由于我们在调用epoll_create时,内核除了帮我们在epoll文件系统里建了个file结点,在内核cache里建了个红黑树用于存储以后epoll_ctl传来的socket外,还会再建立一个list链表,用于存储准备就绪的事件,当epoll_wait调用时,仅仅观察这个list链表里有没有数据即可。有数据就返回,没有数据就sleep,等到timeout时间到后即使链表没数据也返回。所以,epoll_wait非常高效。
可以参考这篇博客:http://blog.youkuaiyun.com/hdutigerkin/article/details/7517390
网络传输协议的定义与实现
网络传输协议的设计其实也简单。
我们把数据包分为请求包和响应包。请求包只有头部,响应包包括头部和数据部分。
请求包的功能包括请求一帧图像,请求图像格式,设置图像格式等等。由于有些请求可能需要附加参数,所以我们这样来定义头部:
1、头部包括3+x个字节
2、依次为,x(附加长度,保存数据长度所占的字节数,有可能是0,1,2,4,8等等);id,表示1请求包的类型;保留字节
3、接下来是x个字节,表示数据部分的长度。
GTK视频播放器的设计
这里主要完成2个功能,一个是登录功能,建立和服务器的连接;另一个功能是请求并显示图片。
这么2项功能,设计起来也算是非常繁琐了,需要绘制图标,绘制标签,显示图片,绘制按钮,按钮的响应事件等等,这里就不一一介绍了。
网络传输协议在播放器中的移植
登录界面调用连接函数,实现和服务器的连接。
登录成功后则调用网络初始化函数,在里面建立保存相关信息后建立一个线程用来处理请求包以及绘制图像,以及保存图像(快照功能)