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
", 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
", ifr.ifr_name);
//printf("localhosp ip: %s
", inet_ntoa( ((struct
sockaddr_in*)&(ifr.ifr_addr))->sin_addr ) );
intaddr = ((structsockaddr_in *)&(ifr.ifr_addr))->sin_addr;
fprintf(stderr,"host addr:%s
", inet_ntoa( intaddr ));
注:
gethostbyname函数在此处无效,如果不修改则会出现的问题是:板子启动完成后,可执行文件webs刚打开,ps下就没有webs的pid,这是因为IP不生效,webs出错所以打不开。另外,我的设备要求IP是DHCP模式,不能给其固定IP,所以在代码中修改为从网卡处获取设备的当前IP地址,注意修改后的代码要包含以下头文件及宏,否则编译报错。
#include
#include
#define ETHERNET_WIRE "eth0"
#define ETHERNET_WIFI "ra0"
(2) 修改服务器根目录:
注释掉以下代码:
/*
getcwd(dir,sizeof(dir));
if((cp = strrchr(dir, '/')))
{
*cp = '