嵌入式中一般是使用开源的Goahead webserver服务器,CGI也都是用C语言进行编写开发的。项目中想要在web上实现图片流的视频播放效果,考虑到两种方法,一种是浏览器端来进行图片的主动获取,一种是服务器端来进行图片的主动推送,即webpush技术。webpush技术显然更高效,但在Goahead上的实现过程中遇到了点问题。
下面是一个最简单的使用C语言编写的CGI来测试使用Goahead是否支持Webpush技术,以及运行的机制。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int ret,i;
printf("HTTP/1.1 200\r\n"); //http协议的头及push技术头
printf("Content-type: multipart/x-mixed-replace;boundary=section\r\n\r\n");
printf("--section\r\n"); //push内容的开始边界,服务器进行识别
for(i = 0; i < 10000; i++)
{
printf("Content-type: text/plain\r\n\r\n"); //指定内容的类型
printf("i = %d\n", i);
printf("--section\n"); //下一次内容开始
fflush(stdout); //刷新内容到浏览器,这个很关键,否则浏览器会是一次性显示的效果
usleep(100000);
}
return 0;
}
上述示例在IE浏览器上无法正确运行实现webpush效果,在Chrome浏览器和Firefox浏览器上均能实现webpush效果,即间隔100ms更新i的值。也就是说Goahead webserver是支持webpush技术的。实现视频流就是将循环中的printf("i = %d\n", i);换成jpg的图片数据发送给浏览器,内容类型改成“image/jpeg"。
但是在测试的过程中遇到了两个主要的问题:
- 如果想要实现图片流的视频播放效果,cgi中就必须是while(1)的无限循环,直到浏览器关闭请求,之后服务器会关掉这个cgi。这样好像会影响其它cgi的执行,这个无限循环是否是必须的?
- cgi的输出,即stdout的文件缓存是追加式的,而不是覆盖式的,即fflush操作并没有情况到之前的文件内容,后面的内容是不断追加的。这样因为第一个中的无限循环就会造成内存溢出问题(Out of memory)。
来源:oschina
链接:https://my.oschina.net/u/195885/blog/118663