从Web服务器读取标准输入

时间:2014-10-06 12:48:51

标签: c cgi

我想在LINUX(SLES64)上的C CGI程序中处理POST数据

在第一步中,我获得了包含内容长度的HTTP标头。

现在我想从标准输入中读取POST数据。

我想读取AT MOST 5000字节的cgi数据。每个POST都会被忽略!

number_of_bytes_read = read(0, buffer, content_length); 

现在有一个特例:

用户在浏览器中填写表单,然后单击“提交”。

apache Web服务器接收请求标头以及表单数据。

Apache接受请求标头“content-length”,在这种情况下为4875字节,它也需要 4875字节长的“字节流”。

现在Apache创建了一个新进程,最终将处理cgi数据。

Apache必须将4875字节的cgi数据传递给新进程。

他是怎么做到的?

他是否正在执行进程间通信,Apache是​​否也在为新进程创建套接字?

在这种情况下另一方面,cgi程序可能会遇到以下问题:

CGI程序获取内容长度,想要在一遍中读取4875个字节,但是到期 网络延迟第一次只有4300字节。

但是如果Apache没有为新的cgi进程(进程间通信)创建套接字,那么可以 这是cgi程序还没有在第一次获取所有字节?

1 个答案:

答案 0 :(得分:2)

由于网络延迟和其他因素,读取可能不会返回5000字节。您想要读取,直到您读取EOF,或读取的字节数达到5000,或者读取返回错误代码,例如通过调用循环中的读取。来自read(2)联机帮助页:

  

成功时,返回读取的字节数(零表示文件结束),文件位置按此编号前进。 如果此数字小于请求的字节数,则不是错误;这可能发生在例如因为现在实际可用的字节数较少(可能是因为我们接近文件结尾,或者因为我们正在从管道或终端读取),或者因为read()被中断了信号。出错时,返回-1,并正确设置errno。在这种情况下,未指定文件位置(如果有)是否发生变化。