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_FILENAME | CGI脚本的完整路径 |
SCRIPT_NAME | CGI脚本的的名称 |
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 <stdlib.h>
#include <string.h>
#include “fcgi_stdio.h”
void Receive_Data(InputBuffer,ContentLength )
{
int i=0;
char InputBuffer[1024]={0};
for(i=0; i<ContentLength ; 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<strlen(str)-1; 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("<p>request = null</p>");
return 0;
}
if (strncmp(pRequestMethod,"POST")==0)
{
printf("<p>OK the method is POST!\n</p>");
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("<p>OK the method is GET!\n</p>");
p = getenv("QUERY_STRING"); //从环境变量QUERY_STRING中得到Form数据
if (p!=NULL)
{
Send_Data(p); //具体译码和处理数据,该函数代码略
}
}
}
return 0;
}
转载于:https://blog.51cto.com/linuxcgi/1965305