我想在LINUX (SLES64)上的C CGI程序中处理POST数据
在第一步中,我获得了具有内容长度的HTTP头。
现在我想从标准输入中读取POST数据。
我想读取最多5000字节的cgi数据。每一个有更多的帖子都会被忽略!
number_of_bytes_read = read(0, buffer, content_length); 现在有一个特殊情况:
用户在浏览器中填写表单,然后单击submit。
apache web服务器接收请求头和表单数据。
Apache接受请求头“内容长度”,在本例中为4875字节,也使用4875字节长的“字节流”。
现在,Apache创建了一个新进程,它将最终处理cgi数据。
Apache必须将cgi数据的4875字节交给新进程。
他是怎么做到的?
他是否正在执行进程间通信,那么Apache是否正在为新进程创建套接字?
在这种情况下,cgi程序可能会遇到以下问题:
CGI程序获取内容长度,想一次读取4875字节,但由于网络延迟,第一次只读取4300字节。
但是,如果Apache不为新的cgi进程(进程间通信)创建一个套接字,那么cgi程序是否也不会在第一次捕获所有字节呢?
发布于 2014-10-06 13:00:15
由于网络延迟和其他因素,read可能不会返回5000字节。您希望读到EOF,或者读取的字节数达到5000,或者read返回错误代码,例如在循环中调用read。来自读(2)手册:
在成功的情况下,返回读取的字节数(零表示文件的结束),文件位置由这个数字前进。如果这个数字小于请求的字节数,这并不是一个错误;例如,这可能是因为现在实际可用的字节较少(可能是因为我们接近文件末尾,或者因为我们从管道或终端读取),或者因为read()被一个信号中断了。 On error,-1被返回,并且errno被适当设置。在这种情况下,未指定文件位置(如果有的话)是否发生更改。
https://stackoverflow.com/questions/26216577
复制相似问题