源码下载
1、源码版本goahead2.5
2、 百度云下载链接https://pan.baidu.com/s/1kklYCSVTwly5Me1d6Hx4rQ 提取码:678g
源码结构
1、|各种OS移植子目录,分别有:CE、ECOS、LINUX、LYNX、MACOSX、NW、QNX4、VXWORKS、WIN
2、| utils:当前只有webcomp.c,即网页编译器
3、| www:存放web网页
4、| wwwdemo:goAhead带的demo网页,里面包含了goAhead的一些文档
5、| goAhead服务器源程序文件(C程序文件)
源码移植
1、修改Makefile文件
CROSS_COMPILE =aarch64-linux-gnu-
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)$<
修改时不仔细可能会导致编译时前后使用的编译器不一致而出错。
2、修改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 = ((struct sockaddr_in *)&(ifr.ifr_addr))->sin_addr;
fprintf(stderr,"host addr:%s\n", inet_ntoa( intaddr ));
也可以改为固定IP地址
intaddr.s_addr = inet_addr(T("192.168.3.81"));
注:
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("/mnt/web");
注:
此处根据实际情况修改为自己的放置网页代码的目录即可。
注释掉默认页面设置:
//websSetDefaultPage(T("default.asp"));
(3)、修改服务器主页:
修改websHomePageHandler函数中的homepage设置:
//websRedirect(wp, “home.asp”);
websRedirect(wp, “index.htm”);
注:
此处把源码中的主页替换为自己的主页即可。
(4)、注意:
如果在没有修改前就在LINUX文件夹下make过,然后接着修改,改完后再次make时,则会出现以下问题:
main.o: Relocations in generic ELF (EM: 3)
main.o: could not read symbols: File inwrong format
这是因为编译器不一致造成的,这样问题只要make clean后,再次make即可。
(5)、移植到arm环境中
将 linux下的webs拷贝到arm板子中,执行 ./webs &就可以
(6)、CGI执行
GoAhead支持标准的CGI执行,代码中已经设置关联了CGI的放置目录,如代码:websUrlHandlerDefine(T("/cgi-bin"),NULL, 0, websCgiHandler, 0);
注意此处设置的cgi-bin的根目录即是web文件的目录,所以只需要把CGI可执行文件放到xxx/web/cgi-bin/目录下即可被GoAhead调用了。注意CGI代码文件也需要使用上面相同的编译器来编译。
(7)、目录结构如图所示