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代码文件也需要使用上面相同的编译器来编译。