使用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