【问题标题】:read standard input from web server从 Web 服务器读取标准输入
【发布时间】:2014-10-06 12:48:51
【问题描述】:

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

在第一步中,我得到带有内容长度的 HTTP 标头。

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

我想读取最多 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 程序获取内容长度,想在 ONE pass 中读取 4875 个字节,但由于 到网络延迟得到第一次只有4300字节。

但是如果 Apache 没有为新的 cgi 进程创建一个套接字(进程间通信),可以 是不是cgi程序也没有在第一时间抓取所有字节?

【问题讨论】:

    标签: c cgi


    【解决方案1】:

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

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

    【讨论】:

    • "您想阅读直到阅读 EOF ..." 或直到所有对 read() 的调用返回的值的总和达到 5000 或 @ 987654323@返回-1
    猜你喜欢
    • 1970-01-01
    • 2013-03-30
    • 2012-02-17
    • 2015-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多