這個(gè)有點(diǎn)難度哦,C或者其他腳本都是在服務(wù)器上運(yùn)行的,運(yùn)行時(shí)對(duì)頁面或者服務(wù)器上的數(shù)據(jù)進(jìn)行初始化,只有js在瀏覽器上運(yùn)行,頁面上的控件屬性的改變也只有讓js來實(shí)現(xiàn)。
為桐柏等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及桐柏網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為網(wǎng)站建設(shè)、做網(wǎng)站、桐柏網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!
1、Web服務(wù)器通過調(diào)用CGI程序?qū)崿F(xiàn)和Web瀏覽器的交互,也就是CGI程序接受Web瀏覽器發(fā)送給Web服務(wù)器的信息,進(jìn)行處理,將響應(yīng)結(jié)果再回送給Web服務(wù)器及Web瀏覽器。CGI程序一般完成Web網(wǎng)頁中表單(Form)數(shù)據(jù)的處理、數(shù)據(jù)庫查詢和實(shí)現(xiàn)與傳統(tǒng)應(yīng)用系統(tǒng)的集成等工作。CGI程序可以用任何程序設(shè)計(jì)語言編寫,如Shell腳本語言、Perl、Fortran、Pascal、C語言等。但是用C語言編寫的CGI程序具有執(zhí)行速度快、安全性高(因?yàn)镃語言程序是編譯執(zhí)行且不可被修改)等特點(diǎn)。CGI接口標(biāo)準(zhǔn)包括標(biāo)準(zhǔn)輸入、環(huán)境變量、標(biāo)準(zhǔn)輸出三部分。
2、標(biāo)準(zhǔn)輸入CGI程序像其他可執(zhí)行程序一樣,可通過標(biāo)準(zhǔn)輸入(stdin)從Web服務(wù)器得到輸入信息,如Form中的數(shù)據(jù),這就是所謂的向CGI程序傳遞數(shù)據(jù)的POST方法。這意味著在操作系統(tǒng)命令行狀態(tài)可執(zhí)行CGI程序,對(duì)CGI程序進(jìn)行調(diào)試。POST方法是常用的方法,本文將以此方法為例,分析CGI程序設(shè)計(jì)的方法、過程和技巧。
3、環(huán)境變量操作系統(tǒng)提供了許多環(huán)境變量,它們定義了程序的執(zhí)行環(huán)境,應(yīng)用程序可以存取它們。Web服務(wù)器和CGI接口又另外設(shè)置了自己的一些環(huán)境變量,用來向CGI程序傳遞一些重要的參數(shù)。
單選框的狀態(tài)和表單里面的其他內(nèi)容比如文本框里面的內(nèi)容一樣是在HTTP post請(qǐng)求的body里面的,存放的方式也是HTTP querystring的方式,就是
name1=value1name2=value2name3=value3...
你的radio通常是由幾個(gè)按鈕組成的,這些按鈕有同樣的名稱,但是value不一樣,所以提交上來的value是什么就表示那個(gè)radio被選中了,其他的就是沒有選中的。
如果你沒有使用什么額外的框架的話,那么需要先獲取content lengh的值,然后從stdin里面讀取所有的content,再對(duì)這些content進(jìn)行解析獲取到需要的radio的狀態(tài)。
這里有個(gè)封裝的類用于解析HTTP請(qǐng)求,不是很完善,但是可以參考下
特別是里面的GetBodyLength,GetBody和ParseQueries這三個(gè)函數(shù),可能對(duì)你有用
唔.. 問題很好, 但得說上幾堂課才能答得完, 這里先給你一些概念做為參巧, 你得再從各個(gè)單元中再發(fā)掘一下.
首先, 客戶端發(fā)送請(qǐng)求後, 接的不是 cgi , 而是 web server, web server 會(huì)將發(fā)送的資料, 連同環(huán)境變數(shù), 打包變成 "參數(shù)" 一拼 "發(fā)送" 給 cgi 程序.
"發(fā)送" 有多種形式, 要視乎 cgi 程序在 shell 時(shí)本身怎樣接收 "參數(shù)" , 例如 Perl 會(huì)以 Command line 的形式, PHP 會(huì)以 | ( pipe ) 的形式. 至於 c 我就不知道了.
QUERY_STRING保存的是瀏覽器地址后的參數(shù)是對(duì)的. 而 QUERY_STRING 亦只會(huì)從 GET 的 request 而來. 即是如果 html 的 method 不是 get 的話, 就不會(huì)有 query_string
POST 的時(shí)候你要 read STDIN 才能得到數(shù)據(jù)是對(duì)的. 但留意 POST 有兩種, 默認(rèn)的是文字, 就 read STDIN 可以, read 到的其實(shí)也是跟 query_string 一樣的格式 ( action=doSomefrom=id... ) 從 符號(hào)中得到數(shù)據(jù)與數(shù)據(jù)之間的分割. 但另一種是 multi part form data. 如果表單中有檔案上傳, 就會(huì)用上這種形式. 首先你就要留意收到的數(shù)據(jù)是 binary data, 而里面的分割是 256 個(gè)字符組成的 boundary line
文本和非文本的分別只在於告訴 file reader 不要誤讀 eof , 就當(dāng)是文件完結(jié), 因?yàn)榉俏谋靖袷街袝?huì)用得 eof 作為檔案的內(nèi)容. 故此, html 本身也是普通文本字串.
所有數(shù)據(jù)只是一氣呵成的丟到下級(jí), 所以并不會(huì)"保存"下來.
進(jìn)的時(shí)機(jī)就是由 SERVER 丟到你的 CGI 程序的那一刻開始;
到你的 CGI 完結(jié)的時(shí)候, 數(shù)據(jù)就會(huì)消失
printf根據(jù)傳入?yún)?shù)轉(zhuǎn)換成字符串,然后輸出到該進(jìn)程的標(biāo)準(zhǔn)輸出緩沖里,當(dāng)緩沖滿或調(diào)用flush(),操作系統(tǒng)再把緩沖里的數(shù)據(jù)進(jìn)行處理,在默認(rèn)情況下標(biāo)準(zhǔn)輸出是控制臺(tái)顯示,這時(shí)操作系統(tǒng)把緩沖里的數(shù)據(jù)顯示出來。
malloc調(diào)用的是操作系統(tǒng)的HeapAlloc()函數(shù),先進(jìn)行安全檢測(cè)和記錄,再調(diào)用HeapAlloc()申請(qǐng)內(nèi)存空間
open 后面可能要加上一個(gè)mode, 表示文件的權(quán)限,
比如: fd = open("/var/www/net.txt", O_CREATE|O_WRONLY, 644);
644 也可以改成777,這樣你的文件可能就能打開成功了,你試試看。