首页 > 网络编程 > 使用C语言来写网页

使用C语言来写网页

下面的文字主要介绍,用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" />
注意 : 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

上一篇: Linux下修改文件创建时间(修改文件更改时间)

下一篇: CGI中常用的环境变量