当前位置:首页 > 公众号精选 > 漫长当下

cgi相关的处理程序已经集成到goahead源码了,可通过me.h配置文件中的宏(ME_GOAHEAD_CGI)来选择启用或者不启用,我们不需要添加额外的代码。

官方提供了一个测试用的cgi程序,源码文件是test目录下的cgitest.c,并且已经生成了可执行文件放在test/cgi-bin目录下,但是这个可执行文件是在官方使用的环境中编译的,我们的环境可能无法运行,需要重新编译才可以,编译完后如果可以运行就说明初步成功了。

这里我不使用官方提供的例程,在test/cgi-bin目录下新建cgiTest.c文件,添加如下代码:

#include 
#include 

int main(int argc,char *argv[])
{
    char *data;
    int i;
    int m = 0,n = 0;

    //这些都是格式要求
    printf("Content-type: text/html\r\n\r\n");
    printf(" Multi S\r\n");
    printf("

Multi S

\r\n");
    //读取web网页返回来的数据
    data = getenv("QUERY_STRING");

    printf("

%s\r\n",data);
    if(!data)
    {
        printf("

 ERROR! DATA NO INPUT\r\n");
    }
    //解析数据
    else if(sscanf(data,"%*[^0-9]%d&%*[^0-9]%d",&m,&n) != 2)
    {
        printf("

 ERROR! DATA GET ERROR\r\n");
    }
    else
    {
        //将解析得到的两个值做乘法,再返回结果
        printf("

 %d * %d = %d.", m, n, m*n);
    }

    return 0;
}

编译

gcc cgiTest.c -o cgiTest

运行

./cgiTest

执行结果

Content-type: text/html


 Multi S

Multi S


(null)

 ERROR! DATA NO INPUT

这样cgi程序就准备好了,还需要一个对应的web文件,为了方便直接修改test/web目录下的index.html,改成如下的内容:

<html><head><title>index.htmltitle>head>
<body>
    Hello /index.html
    <h2>cgiTesth2>
    <form action="/cgi-bin/cgiTest">
        <input type="number" name="var_m" max=9999 />
        br>
        <input type="number" name="var_n" max=9999 step=100 />
        br>
        <input type="submit" value="ok" />
    form>
body>
html>

注意/cgi-bin这个路径是在route.txt文件中指定的,如果你要修改成其它路径,那么对应的你也需要在route.txt文件中添加或直接修改,否则的话运行的时候是找不到对应的cgi程序的。

运行goahead服务器看下效果:

./goahead-test -v --home ../../../test/ web

显示如下的页面后,我们在两个数值输入框中随便填两个值,然后点击ok按钮即可:

9.20.jpg


点击ok按钮后,goahead服务器会fork一个进程(源码中用的vfork系统调用,具体可阅读源码cgi.c)来运行我们写的cgi程序,运行结束后goahead就得到了运行结果,最后回写到浏览器就结束了,最终运行效果如下:

9.21.jpg

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
关闭