webserver中webpush技術的最簡單cgi示例

嵌入式中通常是使用開源的Goahead webserver服務器,CGI也都是用C語言進行編寫開發的。項目中想要在web上實現圖片流的視頻播放效果,考慮到兩種方法,一種是瀏覽器端來進行圖片的主動獲取,一種是服務器端來進行圖片的主動推送,即webpush技術。webpush技術顯然更高效,但在Goahead上的實現過程當中遇到了點問題。 web

下面是一個最簡單的使用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)。
相關文章
相關標籤/搜索