我想在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程序还没有在第一次获取所有字节?
答案 0 :(得分:2)
由于网络延迟和其他因素,读取可能不会返回5000字节。您想要读取,直到您读取EOF,或读取的字节数达到5000,或者读取返回错误代码,例如通过调用循环中的读取。来自read(2)联机帮助页:
成功时,返回读取的字节数(零表示文件结束),文件位置按此编号前进。 如果此数字小于请求的字节数,则不是错误;这可能发生在例如因为现在实际可用的字节数较少(可能是因为我们接近文件结尾,或者因为我们正在从管道或终端读取),或者因为read()被中断了信号。出错时,返回-1,并正确设置errno。在这种情况下,未指定文件位置(如果有)是否发生变化。