使用C语言来写网页
Posted on Mon, 12 Jul 2010 11:59:59 -1100前面的几篇文章简单介绍了一些基础知识,
本文给出一个具体的实例,
先说明一下
测试环境是xampp套件(apache)+win32
开发工具是SlickEdit+Mingw
下面的文字主要介绍,用C语言[CGI]捕获html表单传递的信息.
其实和PHP,PERL类似,简单的方法就是环境变量的获取
[常用的环境变量,我前面的文章已经罗列了一些,这里就不多说了]
在C语言中,环境变量需要通过
char * getenv (const char *)
这个函数来获取,使用时需要包含stdlib.h这个头文件
有了这个函数,其它的就很简单了,写一个html的表单,比如
<form name="input" action="../cgi-bin/test.exe" method="post"> Username: <input type="text" name="user" /> <input type="submit" value="Submit" /> </form>
注意 : action指向所需可执行文件[win下自然是exe了,linux下管用.cgi的后缀]
当然还有一个前提,就是Apache的CGI功能必须打开,这个配置很简单的,过阵子有空了再总结,这里不多罗嗦.
如果我们,输入了一些字符,点击提交后[假设那个test.exe里面用getenv捕获了某个环境变量,并打印出来],
会发现和我们想象的有些差异,
这里简单说明一下,
1.最常见的疑问是html中的转义字符串,命令行中的\n或是\n\r到html里就应该用</br>,类似的还有一些
2.如果我们输入的有空格,那么返回时编程了'+'号
3.如果我们输入一个中文词组[假定GB2132编码]--"你好",那么返回的是 "%C4%E3%BA%C3"
4.其它没有总结的......(哈哈)
1的话自己注意下就好,2和3可以写一个简单的函数避免这些问题,比如像下面这样
void decode(unsigned char *src , unsigned char *dst)
{
unsigned int len=0;
unsigned int i=0,j=0;
len=strlen(src);
while (i<len) {
if (*(src+i) == '+') {
*(dst+j) = ' ';
} else if (*(src+i) == '%') {
unsigned int code;
if (sscanf(src+i+1,"%2x",(unsigned int *)&code)!=1) {
code=(unsigned int)'?';
}
*(dst+j)=(unsigned char)code;
i+=2;
} else{
*(dst+j)=*(src+i);
}
++i;
++j;
}
*(dst+j)='\0';
}
啰嗦的就到这里,下面给出完整的测试用例[关于环境变量的意义,见我前文的总结]
#include<stdio.h>
#include<stdlib.h>
void decode(unsigned char *src , unsigned char *dst)
{
unsigned int len=0;
unsigned int i=0,j=0;
len=strlen(src);
while (i<len) {
if (*(src+i) == '+') {
*(dst+j) = ' ';
} else if (*(src+i) == '%') {
unsigned int code;
if (sscanf(src+i+1,"%2x",(unsigned int *)&code)!=1) {
code=(unsigned int)'?';
}
*(dst+j)=(unsigned char)code;
i+=2;
} else{
*(dst+j)=*(src+i);
}
++i;
++j;
}
*(dst+j)='\0';
}
int main()
{
unsigned char *env;
long len;
printf("%s\n\n", "Content-Type:text/html;charset=gb2312");
env=getenv("CONTENT_LENGTH");
printf("CONTENT_LENGTH : %s</br>",env);
env=getenv("DOCUMENT_ROOT");
printf("DOCUMENT_ROOT : %s</br>",env);
env=getenv("HTTP_REFERER");
printf("HTTP_REFERER : %s</br>",env);
env=getenv("HTTP_USER_AGENT");
printf("HTTP_USER_AGENT : %s</br>",env);
env=getenv("PATH_INFO");
printf("PATH_INFO : %s</br>",env);
env=getenv("PATH_TRANSLATED");
printf("PATH_TRANSLATED : %s</br>",env);
env=getenv("QUERY_STRING");
printf("QUERY_STRING : %s</br>",env);
env=getenv("REMOTE_ADDR");
printf("REMOTE_ADDR : %s</br>",env);
env=getenv("REMOTE_ADDR");
printf("REMOTE_ADDR : %s</br>",env);
env=getenv("REMOTE_HOST");
printf("REMOTE_HOST : %s</br>",env);
env=getenv("REQUEST_METHOD");
printf("REQUEST_METHOD : %s</br>",env);
env=getenv("SCRIPT_NAME");
printf("SCRIPT_NAME : %s</br>",env);
env=getenv("REQUEST_URI");
printf("REQUEST_URI : %s</br>",env);
env=getenv("SERVER_NAME");
printf("SERVER_NAME : %s</br>",env);
env=getenv("SERVER_PORT");
printf("SERVER_PORT : %s</br>",env);
unsigned char oriData[500];
unsigned char data[500];
fgets(oriData,500,stdin);
printf("original data : %s , %d</br>",oriData,strlen(oriData) );
decode(oriData,data);
printf("data : %s , %d</br>",data,strlen(data) );
return 0;
}
对应的html表单的代码前面贴过了,就不重复贴了,
假设我们在表单中填上"你好"这个词组,那么当我们点击提交按钮后,
如果配置正确的话,浏览器会像我们返回类似如下的字串,
CONTENT_LENGTH : 17 DOCUMENT_ROOT : E:/xampp/htdocs HTTP_REFERER : http://localhost/test.html HTTP_USER_AGENT : Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6 PATH_INFO : (null) PATH_TRANSLATED : (null) QUERY_STRING : REMOTE_ADDR : 127.0.0.1 REMOTE_ADDR : 127.0.0.1 REMOTE_HOST : (null) REQUEST_METHOD : POST SCRIPT_NAME : /cgi-bin/test2.exe REQUEST_URI : /cgi-bin/test2.exe SERVER_NAME : localhost SERVER_PORT : 80 original data : user=%C4%E3%BA%C3 , 17 data : user=你好 , 9