Chinaunix首页 | 论坛 | 博客
  • 博客访问: 23278
  • 博文数量: 8
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 10
  • 用 户 组: 普通用户
  • 注册时间: 2016-08-08 20:17
个人简介

一起学习

文章分类

全部博文(8)

文章存档

2017年(1)

2016年(7)

我的朋友
最近访客

分类: 嵌入式

2016-12-12 17:34:12

            BOA CGI移植与实例实验

  在文件系统中经常移植BOA,但没有做过实际的应用。闲暇时自己试了试。留下个笔记。关于移植网络上大把的资源,不想赘述。

源码下载地址: 

最新发行版本: 0.94.14

似乎现在已经没有进行维护了,这个版本已经好久了。2005.2.23 release后就没有更新过了。老外做的东西就是牛逼啊。

编译依赖这两个库,一般都有。我用的ubuntu 。可以使用以下命令安装

sudo apt-get install bison flex

一,编译

源码中需要修改的地方,由于编译器,kernel等的提升,导致下载下来,就有些地方要修改。

点击(此处)折叠或打开

  1. 1, src/compat.h
  2. #define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff
  3. #define TIMEZONE_OFFSET(foo) foo->tm_gmtoff
  4.  
  5. 2, src/log.c
  6. 注释掉下面的代码
  7. if (dup2(error_log, STDERR_FILENO) == -1) {
  8.                          DIE("unable to dup2 the error log");
  9. 3, src/boa.c
  10. 注释掉下面的代码
  11. if (passwdbuf == NULL) {
  12.         DIE(”getpwuid”);
  13.         }
  14.    if (initgroups(passwdbuf->pw_name, passwdbuf->pw_gid) == -1) {
  15.         DIE(”initgroups”);
  16.         }
  17.  
  18. 注释掉下面的代码
  19. if ( setuid ( 0 ) != - 1 ) {
  20.     DIE ( "icky Linux kernel bug!" );
  21. }

编译完成,安装到对应的目录。这时候可能还需要根据自己的实际情况配置一下boa.conf

二,Boa 配置

   安装完后,在根目录 etc/boa.conf 就是boa的配置文件。以实验中源码配置文件为准。

点击(此处)折叠或打开

  1. a,Group :
  2. Group 0
  3.  
  4. b,User :
  5. User root
  6.  
  7. c,ScriptAlias
  8. ScriptAlias /cgi-bin/ /www/cgi-bin/
  9.  
  10. d,DoucmentRoot
  11. DoucmentRoot /www
  12. e,ServerName :
  13. ServerName www.lanrry.com
  14. f,Acesslog
  15. #AccessLog /var/log/boa/access_log


使用过程中常见错误,网上有很多总结这个,以下这个是转

http://blog.sina.com.cn/s/blog_53013a8c0100do7t.html

1.必须要在板子的/etc下建一个boa目录(错误代码忘了)

2.”can't open boa.conf for reading“

 解决:不仅要在你自己放置boa的目录下放入boa.conf配置文件,而且要在板子的/etc/boa
 也要放入
boa.conf文件,这样系统在运行boa的时候才可以读取到boa.conf文件。

3.“unable to dup2 the error log bad file descriptor”
 解决:在boa源码里,即src文件夹下把log.c中的第73行的if语句注释掉。

4."unable to dup2 the error log:Bad file descriptor"

 解决:在boa.conf里,把“#AccessLog /var/log/boa/access_log”注释掉(即去掉#号)。

5.“[01/Jan/2031:00:12:25 +0000] boa.c:226 - icky Linux kernel bug!: No such file or directory”

 解决:在boa源码里,即src文件夹下把boa.c中的第226行的if语句注释掉。

6."gethostbyname:: Resource temporarily unavailable"

 解决:把“#ServerName ”号去掉。

7."./boa: 1: syntax error: "(" unexpected"

 解决:没有修改Makefile,是用gcc编译的,应该改成是arm-linux-gcc编译。

8.如果页面上是:“502 Bad Gateway The CGI was not CGI/1.1 compliant.“

 解决:给你要执行的cgi可执行程序赋个权限。chmod 777 filename

9.在form action="cgi-bin/test2.cgi" method="get"中,cgi可执行程序的路径就直接写“cgi-bin/test2.cgi”就可以了,

 不要写板子上的绝对路径,这样就重复了,因为cgi执行时会自动去boa.conf的指定的路径里找。

10.出现警告:“control reaches end of non-void function”,是因为某个函数没有return,而函数定义时是非void型的。所
 以需要有个返回值。比如
int cgiMain()这个函数就一定要有个返回值的,否则会报这个错误。

12.运行网页时老出现错误:“mkstemp:No such file or diectory”

 解决:不能用post,只能用get。因为post方式需要新建一个临时文件,这就需要用到mkstemp函数。这个函数是在系
统中以唯一的文件名创建一个文件并打开,且只有当前用户才能访问这个临时文件。故权限不够,或其他什么问题都会
报这个错误。那么就用
get吧!这里具体原因细节笔者暂时也不是很清楚...

13.直接写的含有system()函数的c程序用arm-linux-gcc编译到板子上的可以执行,而如果写在cgi中的就不一定能执行了。
 因为牵涉到一个
cgi的权限的问题。即使给你的cgi-bin文件夹下的所有cgi可执行文件都赋了权限,也不一定能执行。

 解决办法就是看看你的boa.conf中的权限设置的如何。这里正确的应该是把“User nobody Group nogroup”改为“User root 
Group 0”
,否则不能正确执行!你会发现你的cgi可执行程序的其他代码都执行了,却只有这个system()函数没有执行!

 

其他可能出现的错误,另外参看

1. 当运行boa程序时出现错误,如下:

  # ./boa

  [27/Nov/1990:13:22:25 + 0000]boa.c:266.icky Linux kernel bug!:No such file

 将 User 0修改成 User nobody

2. 打开网页时,网页中的图片无法显示

 就将存放图片的子目录/var/www/images修改成/var/www/img

3. 在测试cgi脚本时,当在浏览器地址中输入“http//10.10.10.2/cgi-bin/helloworld.cgi”时,浏览输出下述错误:

  502 Bad Gateway

  The CGI was not CGI/1.1 compliant

(:此种错误在使用BOA时十分常见,原因基本都是自己写的cgi程序的输入输出问题)

可能是字符串″Contenttype:text/plain\n\n″没有两个\n导致的。它是一个MIME头信息,告诉Web服务器随后的输
出是以纯
ASCII文本的形式。在这个头信息中有两个新行符,这是因为Web服务器需要在实际的文本信息开始之前
先看见一个空行。

其他错误:

1、错误gethostbyname:: No such file or directory

     解决办法: 修改boa.conf   去掉 ServerName 前的注释符号(#)

2、浏览器报错:502 Bad Gateway The CGI was not CGI/1.1 compliant问题

日志文件中的报错是:cgi-header:unable to find LFLF

1>检查你的 printf("Content-type: text/html\n\n");是否少了\n

2>修改执行文件的权限,chmod 777 *

3、检查 error_log 里面的内容,有如下错误,端口重复,默认端口是80,有可能被其他程序使用了,会出现以下log

  boa.c:194 - unable to bind: Address already in use



三,实战

实验前必须核实以下事项:

1,  配置IP地址

2,  ScriptAlias  /cgi-bin/  /var/www/cgi-bin/

3,  记得要清空浏览器,要不然给人感觉没有修改成功,缓存的原因。多试试清空缓存。

4,  Boa.conf 修改后必须重启 boa ,  boa –c /etc/    (boa.conf 所在目录)

5,  cgi 程序放在cgi-bin目录。html js脚本放在html目录。

 

实验目录

1,  源码自带demo

2,  cgi调用嵌入式主板设备

3,  cgi get post 方法

4,  使用CGIC 库及实现文件上传

5,  cgi + ajax 实现动态网页

 

<>源码自带DEMO                                                      

实验环境:

PC windows 7

嵌入式主板:IMX287 , linux.2.6.31

PC机与嵌入式主板在同一局域网。

实验源码: cgi_demo1.rar

配置见附件,展示一下源码。自带的DEMO 基本上不用做什么修改就可以直接通过IE访问 style="font-family:宋体;color:#000000;">嵌入式主板IP

Index.html  源码

点击(此处)折叠或打开

  1. <html>
  2. <head>
  3. <title> index.html test page for http server </title>
  4. </head>
  5. <body bgcolor="#FFFFFF">
  6. <h1 align=center> Test Page </h1>
  7. There is a CGI test page <a href=/cgi-bin/test_cgi> here </a>
  8. <br>
  9. There is a copy of the LTIB FAQ <a href=http://www.lanrry.com> here </a>
  10. <br>
  11. </body>
  12. </html>

test_cgi.c 源码

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. int main()
  3. {

  4.   printf("Content-type: text/html\n\n");
  5.   printf("\n");
  6.   printf("\n");
  7.   printf(" CGI test \n");
  8.   printf("\n");
  9.   printf("\n");
  10.   printf("CGI test example\n");
  11.   printf("\n");
  12.   printf("\n");
  13.   return 0;
  14. }

实验结果图:


点击CGI test page 那个超链接,就相当于运行了test_cgi



对于HTML 语言不了解的同学,可以参考一下,下面的这个网站。

当年在大学也是闲来无事,想看看是怎么做网页的,看了两集的HTML语言的视频,没想到在这个上面用到了,
虽然忘记得差不多,多少还是有点印象的。想起爱因斯坦说过的,拉小提琴也是有裨益于他做研究的。


<二>,CGI调用嵌入式主板设                                                                           

实验环境:

PC windows 7

嵌入式主板:IMX287 , linux.2.6.31

PC机与嵌入式主板在同一局域网。嵌入式主板设备就是LED灯,能点亮LED ,其他的设备调用就大同小异了。
实验源码:cgi_led.rar

led.html 源码

点击(此处)折叠或打开

  1. <html>
  2. <head>
  3. <title> BOA CGI 调用底层设备</title>
  4. </head>
  5. <body bgcolor="#FFFFFF">
  6. <h1 align=center> Test Page </h1>
  7. LED亮灭循环 <a href=/cgi-bin/cgi_led> here </a>
  8. <br>
  9. </body>
  10. </html>

cgi_led.c 源码

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/types.h>
  4. #include <sys/stat.h>
  5. #include <fcntl.h>

  6. #define IOCTL_LED_ON 1
  7. #define IOCTL_LED_OFF 0
  8.                                                
  9. int testleds(void)
  10. {
  11.      int fd = -1;
  12.         unsigned char i=0;
  13.         unsigned char buf;
  14.         if ((fd = open("/dev/myled", O_RDWR)) < 0)
  15.         {
  16.             printf("open /dev/myled error \n");
  17.             return -1;
  18.         }
  19.         for( i = 0 ; i < 4 ; i++ )
  20.         {
  21.             ioctl(fd, IOCTL_LED_OFF, i);
  22.         }
  23.         printf("led。");
  24.         sleep(1);
  25.         for( i = 4 ; i > 0 ; i-- )
  26.         {
  27.             ioctl(fd, IOCTL_LED_ON, i-1); //点亮它
  28.         }
  29.      sleep(1);
  30.         for( i = 4 ; i > 0 ; i-- )
  31.         {
  32.             ioctl(fd, IOCTL_LED_OFF, i-1); // 熄灭它
  33.         }
  34.         close(fd);
  35.         return 0;            
  36. }


  37. int main(void)
  38. {
  39.    printf("Content-Type:text/html;charset=gb2312 \n\n");
  40.    printf("\n");
  41.    printf("\n");
  42.    printf(" BOA CGI 调用底层设备 \n");
  43.    printf("\n");
  44.    printf("\n");
  45.    printf("调用 LED 设备");
  46.    printf("LED 交替亮灭。");
  47.    testleds();
  48.    printf("\n");
  49.    printf("\n");
  50.    printf("\n");
  51.    return (0);
  52. }
testleds()就是进行调用LED设备,板上的灯应该会出现亮灭变化

实验中发现问题, 后,灯并没有出现任何变化。出现如下页面提示



首先想到的是程序是不是有错误,检查了一次,没有发现错误。然后直接在www/cgi-bin/目录下直接运行
./cgi_led ,程序正常运行,没有报任何错误。那么就应该是open  LED设备时出错,这时候想到了linux中权
限问题。直接将
cgi_led 修改成 777 ,然并卵。这时候问了度娘,还真找到答案了,就是前面引用中有的。
boa.conf 必须修改

User nobody

Group nobody

修改为

User root

Group 0

这时候修改完后,须要注意实战前的四项。top 查看后,会发现boa 这个进程的user 这一栏会有变化,从nobody
变到了root


 

好了,到此上图。LED 也自然就正常调用,亮灭变化。

 

<>CGI  GET POST                                                                             

实验环境:

PC 机 :windows 7

嵌入式主板:IMX287 , linux.2.6.31
实验源码:
get_post.rar

这个实验是参考如下链接:http://blog.chinaunix.net/uid-21275705-id-224310.html

cgi 编译后放在/var/www/cgi-bin/目录下,将html 文件更名为get_post.html。访问如下图:





点击 sum 按钮后,出现如下页面。当然就是正确的了。

--------------------------------------------------------------------------------------------------------------
-----------------由于长的发不了,分两篇吧---------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------



阅读(1202) | 评论(0) | 转发(0) |
0

上一篇:etc/fstab 文件详解

下一篇:fflush(stdout)

给主人留下些什么吧!~~