webserver中webpush技术的最简单cgi示例

天涯浪子 提交于 2020-03-02 18:37:55

嵌入式中一般是使用开源的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"。

但是在测试的过程中遇到了两个主要的问题:

  1. 如果想要实现图片流的视频播放效果,cgi中就必须是while(1)的无限循环,直到浏览器关闭请求,之后服务器会关掉这个cgi。这样好像会影响其它cgi的执行,这个无限循环是否是必须的?
  2. cgi的输出,即stdout的文件缓存是追加式的,而不是覆盖式的,即fflush操作并没有情况到之前的文件内容,后面的内容是不断追加的。这样因为第一个中的无限循环就会造成内存溢出问题(Out of memory)。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!