HTTP报文实例

使用C语言来写网页

pingf posted @ Mon, 12 Jul 2010 11:59:59 -1100 in Web with tags 创作 学习 , 13830 readers

前面的几篇文章简单介绍了一些基础知识,

本文给出一个具体的实例,

先说明一下

测试环境是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
KVS KG1 Question Ban said:
Tue, 27 Sep 2022 00:53:46 -1100

Kendriya Vidyalaya Sangathan has provided the practice question paper for Preschool Kindergarten education subject-wise practice question paper with model sample paper for all LKG/PP1/KG1 students through KVS Teaching staff at all region schools across the Country. KVS KG1 Question Bank Kendriya Vidyalaya Sangathan has provided the practice question paper for Preschool Kindergarten education subject-wise practice question paper with model sample paper for all LKG/PP1/KG1 students through KVS Teaching staff at all region schools across the Country.


Login *


loading captcha image...
(type the code from the image)
or Ctrl+Enter