linux cgi函数,CGI编程中POST/GET详解

本文详细介绍了CGI(通用网关接口)的工作原理,重点讲解了几个关键环境变量如CONTENT_TYPE、CONTENT_LENGTH、HTTP_COOKIE、HTTP_USER_AGENT等的作用,以及它们在处理来自HTML表单和GET/POST请求时的使用。通过实例演示展示了如何通过CGI程序获取和处理这些信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CGI全称是“通用网关接口”(Common Gateway Interface),HTTP服务器与你的或其它机器上的程序进行“交谈”的一种工具,其程序一般运行在网络服务器上。 CGI可以用任何一种语言编写,只要这种语言具有标准输入、输出和环境变量.变量名描述

CONTENT_TYPE这个环境变量的值指示所传递来的信息的MIME类型。目前,环境变量CONTENT_TYPE一般都是:application/x-www-form-urlencoded,他表示数据来自于HTML表单。

CONTENT_LENGTH如果服务器与CGI程序信息的传递方式是POST,这个环境变量即使从标准输入STDIN中可以读到的有效数据的字节数。这个环境变量在读取所输入的数据时必须使用。

HTTP_COOKIE客户机内的 COOKIE 内容。

HTTP_USER_AGENT提供包含了版本数或其他专有数据的客户浏览器信息。

PATH_INFO这个环境变量的值表示紧接在CGI程序名之后的其他路径信息。它常常作为CGI程序的参数出现。

QUERY_STRING如果服务器与CGI程序信息的传递方式是GET,这个环境变量的值即使所传递的信息。这个信息经跟在CGI程序名的后面,两者中间用一个问号'?'分隔。

REMOTE_ADDR这个环境变量的值是发送请求的客户机的IP地址

REMOTE_HOST这个环境变量的值包含发送CGI请求的客户机的主机名。如果不支持你想查询,则无需定义此环境变量。

REQUEST_METHOD提供脚本被调用的方法。对于使用 HTTP/1.0 协议的脚本,仅 GET 和 POST 有意义。

SCRIPT_FILENAMECGI脚本的完整路径

SCRIPT_NAMECGI脚本的的名称

SERVER_NAME这是你的 WEB 服务器的主机名、别名或IP地址。

SERVER_SOFTWARE这个环境变量的值包含了调用CGI程序的HTTP服务器的名称和版本号

因为在fcgi_stdio.h中对printf进行了宏转向,在程序里的printf 不再是标准输出了

#define putchar  FCGI_putchar

#define getchar  FCGI_getchar

DLLAPI int        FCGI_putchar(int c);

DLLAPI int        FCGI_getchar(void);

实例

#include  

#include  

#include “fcgi_stdio.h”

void Receive_Data(InputBuffer,ContentLength )

{

int i=0;

char InputBuffer[1024]={0};

for(i=0; i

InputBuffer[ContentLength ++] =getchar();

}

}

void Send_Data(p)

{

int i=0;

char *str="hello  fcgi !!"

printf( "Status: 200 OK\r\n\r\n" );

for (i=0; i

putchar((int)str[i]);

}

}

int main(int argc, char*argv[])

{

char   *p=NULL;

int   ContentLength;   /*数据长度*/

char   *pRequestMethod;     /*   METHOD属性值   */

while(FCGI_Accept()>0)

{

/*   从环境变量REQUEST_METHOD中得到METHOD属性值   */

pRequestMethod = getenv("REQUEST_METHOD");

if(pRequestMethod==NULL)

{

printf("

request = null

");

return   0;

}

if (strncmp(pRequestMethod,"POST")==0)

{

printf("

OK the method is POST!\n

");

p = getenv("CONTENT_LENGTH");     //从环境变量CONTENT_LENGTH中得到数据长度

if (p!=NULL)

{

ContentLength = strtol(p, NULL, 10);

}

else

{

ContentLength = 0;

}

Receive_Data(ContentLength );

}

else if (strncmp(pRequestMethod,"GET")==0)

{

printf("

OK the method is GET!\n

");

p = getenv("QUERY_STRING");     //从环境变量QUERY_STRING中得到Form数据

if   (p!=NULL)

{

Send_Data(p);    //具体译码和处理数据,该函数代码略

}

}

}

return   0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值