cgi相关的处理程序已经集成到goahead源码了,可通过me.h配置文件中的宏(ME_GOAHEAD_CGI)来选择启用或者不启用,我们不需要添加额外的代码。
官方提供了一个测试用的cgi程序,源码文件是test目录下的cgitest.c,并且已经生成了可执行文件放在test/cgi-bin目录下,但是这个可执行文件是在官方使用的环境中编译的,我们的环境可能无法运行,需要重新编译才可以,编译完后如果可以运行就说明初步成功了。
这里我不使用官方提供的例程,在test/cgi-bin目录下新建cgiTest.c文件,添加如下代码:
#include <stdio.h>
#include <stdlib.h>
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("<TITLE> Multi S</TITLE>\r\n");
printf("<H3>Multi S</H3>\r\n");
//读取web网页返回来的数据
data = getenv("QUERY_STRING");
printf("<P>%s\r\n",data);
if(!data)
{
printf("<P> ERROR! DATA NO INPUT\r\n");
}
//解析数据
else if(sscanf(data,"%*[^0-9]%d&%*[^0-9]%d",&m,&n) != 2)
{
printf("<P> ERROR! DATA GET ERROR\r\n");
}
else
{
//将解析得到的两个值做乘法,再返回结果
printf("<P> %d * %d = %d.", m, n, m*n);
}
return 0;
}
编译
gcc cgiTest.c -o cgiTest
运行
./cgiTest
执行结果
Content-type: text/html
<TITLE> Multi S</TITLE>
<H3>Multi S</H3>
<P>(null)
<P> ERROR! DATA NO INPUT
这样cgi程序就准备好了,还需要一个对应的web文件,为了方便直接修改test/web目录下的index.html,改成如下的内容:
<html><head><title>index.html</title></head>
<body>
Hello /index.html
<h2>cgiTest</h2>
<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
打开浏览器输入网址:
127.0.0.1:18080
显示如下的页面后,我们在两个数值输入框中随便填两个值,然后点击ok按钮即可:
点击ok按钮后,goahead服务器会fork一个进程(源码中用的vfork系统调用,具体可阅读源码cgi.c)来运行我们写的cgi程序,运行结束后goahead就得到了运行结果,最后回写到浏览器就结束了,最终运行效果如下: