2014-10-06 101 views
2

我想在LINUX(SLES64)上的C CGI程序中處理POST數據從Web服務器讀取標準輸入

第一步,我得到帶有內容長度的HTTP標頭。

現在我想從標準輸入中讀取POST數據。

我想讀取大約5000字節的CGI數據。每個帖子都會被忽略!

number_of_bytes_read = read(0, buffer, content_length); 

現在有一個特殊情況:

用戶填寫在瀏覽器中的表單,然後他點擊提交。

apache web服務器接收請求頭和表單數據。

Apache將請求標頭「content-length」,在本例中爲4875個字節,也需要使用長度爲「字節流」的4875個字節的 。

現在Apache創建一個新的進程,最終將處理cgi數據。

Apache必須將cgi數據的4875個字節交給新進程。

他是怎麼做到的?

他是否正在執行進程間通信,Apache是​​否正在爲新進程創建一個套接字?

在這種情況下,另一邊,CGI程序可以遇到以下問題:

CGI程序獲取內容長度,希望在一次通過讀取4875個字節,但由於 網絡延遲得到第一次只有4300字節。

但是,如果Apache沒有創建一個套接字到新的cgi進程(進程間通信),可能 它是因爲cgi程序也不能在第一次獲取所有字節?

回答

2

由於網絡延遲和其他因素,讀取可能不會返回5000字節。直到閱讀EOF爲止,或者讀取的字節數達到5000,或者讀取返回錯誤代碼,例如通過在循環中調用read來讀取。從read(2)聯機幫助頁:

成功時返回讀取的字節數(零表示文件結束),並且文件位置按此數字提前。 如果此數字小於請求的字節數,則不會發生錯誤;這可能發生,例如因爲現在實際上可用的字節更少(可能因爲我們接近文件結束,或者因爲我們正在從管道讀取數據或從終端讀取數據),或者因爲read()被一個信號。出錯時,返回-1,並且適當地設置errno。在這種情況下,未指定文件位置(如果有)是否發生更改。

+1

「*您要讀取直到您讀取EOF ... *」,或者直到所有調用read()返回的值的總和爲5000或read()返回爲止。 -1'。 – alk 2014-10-06 13:02:40

+0

感謝您的接觸,我更新了我的答案。 – CalumMcCall 2014-10-06 13:04:07