Linux平台上移植嵌入式WEB服务器GoAhead2.5

GoAhead WebServer是一个源码、免费、功能强大、可以在多个平台运行的嵌入式WebServer。它的主要特性有:

1. 支持ASP;

2. 嵌入式的javascript;

3. 标准的CGI执行;

4. 内存中的CGI处理GoFroms;

5. 扩展的API;

6. 快速响应,每秒可处理超过50个请求;

7. 完全和标准兼容;

8. 如果不包含SSI,仅要求60K的内存;包含SSI,要求500K内存;

9. web页面可以存在ROM或文件系统中;

10. 支持多种操作系统,包括eCos 、LINUX 、LynxOS 、QNX 、VxWorks 、WinCE、pSOS等;

 

GoAhead源代码中包含有用于多个平台的编译文件和makefile、main.c,进入相应的平台目录下进行编译即可获得支持相应平台的可执行程序。我移植的设备中是Linux平台,进入LINUX目录下修改该文件夹下的Makefile和main.c即可。

 

一、LINUX目录下的main.c:

(1)    修改initwebs(...) 函数中代码使设备获取网卡的IPaddress:

注释以下代码:

/*

if((hp = gethostbyname(host)) == NULL) {

error(E_L,E_LOG, T("Can'tget host address"));

fprintf(stderr,"initWebs:host name %s\r", host);

return-1;

}

memcpy((char*) &intaddr, (char *) hp->h_addr_list[0],

(size_t)hp->h_length);

*/

/*

intaddr.s_addr= inet_addr("192.168.1.100");

/*

修改为如下代码:

struct  ifreq ifr;

int sockfd = -1;

 

sockfd= socket(AF_INET, SOCK_DGRAM, 0);

if(sockfd < 0 )

{

               printf("socket");

               return -1;

}

strcpy(ifr.ifr_name,ETHERNET_WIRE);

if(ioctl(sockfd, SIOCGIFADDR, &ifr) < 0 )

{

                  printf("ioctl:gethost ip error");

                 return-1;

}

printf("ifr_name:%s\n", ifr.ifr_name);

//printf("localhosp ip: %s\n", inet_ntoa( ((struct

sockaddr_in*)&(ifr.ifr_addr))->sin_addr ) );

intaddr = ((structsockaddr_in *)&(ifr.ifr_addr))->sin_addr;

fprintf(stderr,"host addr:%s\n", inet_ntoa( intaddr ));

注:

gethostbyname函数在此处无效,如果不修改则会出现的问题是:板子启动完成后,可执行文件webs刚打开,ps下就没有webs的pid,这是因为IP不生效,webs出错所以打不开。另外,我的设备要求IP是DHCP模式,不能给其固定IP,所以在代码中修改为从网卡处获取设备的当前IP地址,注意修改后的代码要包含以下头文件及宏,否则编译报错。

#include <sys/ioctl.h>

#include <net/if.h>

#define ETHERNET_WIRE "eth0"

#define ETHERNET_WIFI "ra0"

 

 

(2) 修改服务器根目录:

注释掉以下代码:

       /*

         getcwd(dir,sizeof(dir));

         if((cp = strrchr(dir, '/')))

         {

         *cp = '\0';

         }

         sprintf(webdir,"%s/%s", dir, rootWeb);

*/

修改为:

         sprintf(webdir,"%s", rootWeb);

         fprintf(stderr,"web dir: %s\n", webdir);

把staticchar_t  *rootWeb = T("web");

改成static char_t  *rootWeb = T("/etc/web/");

注:此处根据实际情况修改为自己的放置网页代码的目录即可。

 

注释掉默认页面设置:

//websSetDefaultPage(T("default.asp"));

 

(3) 修改服务器主页:

修改websHomePageHandler函数中的homepage设置:

//websRedirect(wp, “home.asp”);

websRedirect(wp, “index.htm”);

注:此处把源码中的主页替换为自己的主页即可。

 

 (4)  修改Makefile:

加上:

CROSS_COMPILE   =arm-hismall-linux-

AS     = $(CROSS_COMPILE)as

LD     = $(CROSS_COMPILE)ld

CC     = $(CROSS_COMPILE)gcc

AR     = $(CROSS_COMPILE)ar

STRIP  = $(CROSS_COMPILE)strip

 

修改最后一行:

$(CC) -c -o $@ $(DEBUG) $(CFLAGS)$(IFLAGS) $<

早期版本如2.18的源码中,最后一行为:

cc -c -o $@ $(DEBUG) $(CFLAGS) $(IFLAGS)$<

修改时不仔细可能会导致编译时前后使用的编译器不一致而出错。

注意:

如果在没有修改前就在LINUX文件夹下make过,然后接着修改,改完后再次make时,则会出现以下问题:

main.o: Relocations in generic ELF (EM: 3)

main.o: could not read symbols: File inwrong format

这是因为编译器不一致造成的,这样问题只要make clean后,再次make即可。

 

(5) CGI执行

GoAhead支持标准的CGI执行,代码中已经设置关联了CGI的放置目录,如代码:websUrlHandlerDefine(T("/cgi-bin"),NULL, 0, websCgiHandler, 0);

注意此处设置的cgi-bin的根目录即是web文件的目录,所以只需要把CGI可执行文件放到xxx/web/cgi-bin/目录下即可被GoAhead调用了。注意CGI代码文件也需要使用上面相同的编译器来编译。

 

附:

修改后的移植示例代码:http://download.csdn.net/detail/zqj6893/6417271


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值