加入收藏 | 设为首页 | 会员中心 | 我要投稿 安卓应用网 (https://www.0791zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > PHP > 正文

[PHP] 通用网关接口CGI 的运行原理

发布时间:2020-05-25 03:13:29 所属栏目:PHP 来源:互联网
导读:CGI 的运行原理:1.客户端访问某个 URL 地址之后,通过 GET/POST/PUT 等方式提交数据,并通过 HTTP 协议向 Web 服务器发出请求。2.服务器端的 HTTP Daemon(守护进程)启动一个子进程。然后在子进程中,将 HTTP 请求里描述的信息通过标准输入 stdin 和环境变

CGI 的运行原理:1.客户端访问某个 URL 地址之后,通过 GET/POST/PUT 等方式提交数据,并通过 HTTP 协议向 Web 服务器发出请求。2.服务器端的 HTTP Daemon(守护进程)启动一个子进程。然后在子进程中,将 HTTP 请求里描述的信息通过标准输入 stdin 和环境变量传递给 URL 指定的 CGI 程序,并启动此应用程序进行处理,处理结果通过标准输出 stdout 返回给 HTTP Daemon 子进程。再由 HTTP Daemon 子进程通过 HTTP 协议返回给客户端。

#include <.h>

<span style="color: #0000ff">#define SERV_PORT 9003

<span style="color: #0000ff">char str_join(<span style="color: #0000ff">char str1,<span style="color: #0000ff">char *<span style="color: #000000">str2);

<span style="color: #0000ff">char html_response(<span style="color: #0000ff">char res,<span style="color: #0000ff">char *<span style="color: #000000">buf);

<span style="color: #0000ff">int main(<span style="color: #0000ff">void<span style="color: #000000">) {
<span style="color: #0000ff">int<span style="color: #000000"> lfd,cfd;
<span style="color: #0000ff">struct<span style="color: #000000"> sockaddr_in serv_addr,clin_addr;
socklen_t clin_len;
<span style="color: #0000ff">char buf[<span style="color: #800080">1024],web_result[<span style="color: #800080">1024<span style="color: #000000">];
<span style="color: #0000ff">int<span style="color: #000000"> len;
FILE *<span style="color: #000000">cin;

</span><span style="color: #0000ff"&gt;if</span> ((lfd = socket(AF_INET,SOCK_STREAM,<span style="color: #800080"&gt;0</span>)) == -<span style="color: #800080"&gt;1</span><span style="color: #000000"&gt;) {
    perror(</span><span style="color: #800000"&gt;"</span><span style="color: #800000"&gt;create socket failed</span><span style="color: #800000"&gt;"</span><span style="color: #000000"&gt;);
    exit(</span><span style="color: #800080"&gt;1</span><span style="color: #000000"&gt;);
}

memset(</span>&amp;serv_addr,<span style="color: #800080"&gt;0</span>,<span style="color: #0000ff"&gt;sizeof</span><span style="color: #000000"&gt;(serv_addr));
serv_addr.sin_family </span>=<span style="color: #000000"&gt; AF_INET;
serv_addr.sin_addr.s_addr </span>=<span style="color: #000000"&gt; htonl(INADDR_ANY);
serv_addr.sin_port </span>=<span style="color: #000000"&gt; htons(SERV_PORT);

</span><span style="color: #0000ff"&gt;if</span> (bind(lfd,(<span style="color: #0000ff"&gt;struct</span> sockaddr *) &amp;serv_addr,<span style="color: #0000ff"&gt;sizeof</span>(serv_addr)) == -<span style="color: #800080"&gt;1</span><span style="color: #000000"&gt;) {
    perror(</span><span style="color: #800000"&gt;"</span><span style="color: #800000"&gt;bind error</span><span style="color: #800000"&gt;"</span><span style="color: #000000"&gt;);
    exit(</span><span style="color: #800080"&gt;1</span><span style="color: #000000"&gt;);
}

</span><span style="color: #0000ff"&gt;if</span> (listen(lfd,<span style="color: #800080"&gt;128</span>) == -<span style="color: #800080"&gt;1</span><span style="color: #000000"&gt;) {
    perror(</span><span style="color: #800000"&gt;"</span><span style="color: #800000"&gt;listen error</span><span style="color: #800000"&gt;"</span><span style="color: #000000"&gt;);
    exit(</span><span style="color: #800080"&gt;1</span><span style="color: #000000"&gt;);
}

signal(SIGCLD,SIG_IGN);

</span><span style="color: #0000ff"&gt;while</span> (<span style="color: #800080"&gt;1</span><span style="color: #000000"&gt;) {
    clin_len </span>= <span style="color: #0000ff"&gt;sizeof</span><span style="color: #000000"&gt;(clin_addr);
    </span><span style="color: #0000ff"&gt;if</span> ((cfd = accept(lfd,(<span style="color: #0000ff"&gt;struct</span> sockaddr *) &amp;clin_addr,&amp;clin_len)) == -<span style="color: #800080"&gt;1</span><span style="color: #000000"&gt;) {
        perror(</span><span style="color: #800000"&gt;"</span><span style="color: #800000"&gt;接收错误n</span><span style="color: #800000"&gt;"</span><span style="color: #000000"&gt;);
        </span><span style="color: #0000ff"&gt;continue</span><span style="color: #000000"&gt;;
    }

    cin </span>= fdopen(cfd,<span style="color: #800000"&gt;"</span><span style="color: #800000"&gt;r</span><span style="color: #800000"&gt;"</span><span style="color: #000000"&gt;);
    setbuf(cin,(</span><span style="color: #0000ff"&gt;char</span> *) <span style="color: #800080"&gt;0</span><span style="color: #000000"&gt;);
    fgets(buf,</span><span style="color: #800080"&gt;1024</span>,cin); <span style="color: #008000"&gt;//</span><span style="color: #008000"&gt;读取第一行</span>
    printf(<span style="color: #800000"&gt;"</span><span style="color: #800000"&gt;n%s</span><span style="color: #800000"&gt;"</span><span style="color: #000000"&gt;,buf);

    </span><span style="color: #008000"&gt;//</span><span style="color: #008000"&gt;============================ cgi 环境变量设置演示 ============================

    </span><span style="color: #008000"&gt;//</span><span style="color: #008000"&gt; 例如 "GET /cgi-bin/user?id=1 HTTP/1.1";</span>

    <span style="color: #0000ff"&gt;char</span> *delim = <span style="color: #800000"&gt;"</span> <span style="color: #800000"&gt;"</span><span style="color: #000000"&gt;;
    </span><span style="color: #0000ff"&gt;char</span> *<span style="color: #000000"&gt;p;
    </span><span style="color: #0000ff"&gt;char</span> *method,*filename,*<span style="color: #000000"&gt;query_string;
    </span><span style="color: #0000ff"&gt;char</span> *query_string_pre = <span style="color: #800000"&gt;"</span><span style="color: #800000"&gt;QUERY_STRING=</span><span style="color: #800000"&gt;"</span><span style="color: #000000"&gt;;

    method </span>= strtok(buf,delim);         <span style="color: #008000"&gt;//</span><span style="color: #008000"&gt; GET</span>
    p = strtok(NULL,delim);             <span style="color: #008000"&gt;//</span><span style="color: #008000"&gt; /user?id=1 </span>
    filename = strtok(p,<span style="color: #800000"&gt;"</span><span style="color: #800000"&gt;?</span><span style="color: #800000"&gt;"</span>);           <span style="color: #008000"&gt;//</span><span style="color: #008000"&gt; /user</span>

    <span style="color: #0000ff"&gt;if</span> (strcmp(filename,<span style="color: #800000"&gt;"</span><span style="color: #800000"&gt;/favicon.ico</span><span style="color: #800000"&gt;"</span>) == <span style="color: #800080"&gt;0</span><span style="color: #000000"&gt;) {
        </span><span style="color: #0000ff"&gt;continue</span><span style="color: #000000"&gt;;
    }

    query_string </span>= strtok(NULL,<span style="color: #800000"&gt;"</span><span style="color: #800000"&gt;?</span><span style="color: #800000"&gt;"</span>);    <span style="color: #008000"&gt;//</span><span style="color: #008000"&gt; id=1</span>

(编辑:安卓应用网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读