BOA学习记录总结

来源:互联网 发布:数控编程帅气宝塔图纸 编辑:程序博客网 时间:2024/05/16 10:05
题目:架设好了boa-0.94.13,编写了一个简单的表单html,和c语言cgi,
          运行报“502   Bad   Gateway  The   CGI   was   not   CGI/1.1   compliant.”错误
1、HTML文件
<html>
<head>
<title>form</title>
</head>
<body>
<form name="myform" method="post" action="/cgi-bin/cgi_test.cgi">
name:<input type="text" name="x"/><br/>
pass:<input type="text" name="y"/><br/>
<input type="submit" value="input"/>
<input type="reset" value="reset"/>
</form>
</body>
</html>
2、C语言cgi文件
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main()
{
int length;
char * method;
char *inputstring;
char *inputstring2;
char *inputstring3;
char *inputstring4;

inputstring=getenv("CONTENT_TYPE");
    inputstring2=getenv("QUERY_STRING");
    inputstring3=getenv("CONTENT_LENGTH");

method=getenv("REQUEST_METHOD");
if(method==NULL)
{
printf("no call by serv\n"); 
return 1;
}
if(!strcmp(method,"POST"))
{
length=atoi(getenv("CONTENT_LENGTH"));
if(length!=0)
{
inputstring4=malloc(sizeof(char)*length+1);
fread(inputstring4,sizeof(char),length,stdin);
}
}else if(!strcmp(method,"GET")){
inputstring4=getenv("QUERY_STRING");
length=strlen(inputstring4);
}


printf("Content- type:text/html\r\n\r\n");
printf("<html>");
        printf("<p>");
printf(getenv("CONTENT_TYPE"));
printf(inputstring4);
printf("</p>");
        printf("<p>");
        printf("Hello cgi!");
printf("send data method:%s,content_type:%s,query_string:%s,content_length:%s\n",method,inputstring,inputstring2,inputstring3);
printf("</p>");
printf("</html>");
return 0;
}
3、问题解决思路
参考各位前辈的经验,依次试了这三种方法
(1) 改变CGI程序的权限 chmod 755 ***.cgi
(2) CGI程序中写头的时候不能丢了 “\n\r\n” 两个换行符! printf("Content-type:text/html\n\r\n");
(3) 这个方法得以解决:
1:修改boa代码cgi.c,在  complete_env 函数中添加环境变量  
my_add_cgi_env(req,   "LD_LIBRARY_PATH",   "/lib"),然后重新make即可;     
2:编译时加入一个参数,具体如下:  
gcc   -static   test.c   -o   test.cgi  

4、总结
(1)最早表单form中文本框没有赋“name=”值,导致无论是get、post方法都只能收到REQUEST_METHOD变量的值,get方法地址栏?号后面是空白。必须得给它们命名
(2)编译时加静态-static选项文件大小扩大100倍,有60多兆。
(3)感觉是my_add_cgi_env(req,   "LD_LIBRARY_PATH",   "/lib")起了作用,pc改了以后再pc上可以顺利运行,但开发板未改,交叉编译至开发板后上述问题依然存在
(4)get方法对应的CONTENT_TYPE,CONTENT_LENGTH变量均为空,post方法对应的QUERY_STRING变量为空。





原创粉丝点击