2014-10-06 100 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