1、下载GoAhead2.5

  下载地址:https://github.com/embedthis/goahead/releases?after=v3.1.2

2、编译

  先解压到虚拟机的/opt目录下,cd /opt/goahead-2.5.0/LINUX,修改Makefile文件,在文件的最前面添加如下代码:

  CROSS_COMPILE =/opt/arm-linux-gnueabihf/bin/arm-linux-gnueabihf-
  AS = $(CROSS_COMPILE)as
  LD = $(CROSS_COMPILE)ld
  CC = $(CROSS_COMPILE)gcc
  CPP = $(CC) -E
  AR = $(CROSS_COMPILE)ar
  NM = $(CROSS_COMPILE)nm
  STRIP = $(CROSS_COMPILE)strip
  OBJCOPY = $(CROSS_COMPILE)objcopy
  OBJDUMP = $(CROSS_COMPILE)objdump

  修改输出库名称:

  ARCH = libwebs_arm_linux_gnueabihf.a

  注释掉SSL功能,并保存

  #matrixsslDir:=$(shell ls -d ../matrixssl-3-1*/)

  make

  这时会在LINUX目录下生成libwebs_arm_linux_gnueabihf.a库,/opt/goahead-2.5.0目录下所有头文件(wsInitn.h、websSSL.h、websda.h、webs.h、um.h、uemf.h、md5.h、matrixSSLSocket.h、emfdb.h、ejIntrn.h、ej.h)和libwebs_arm_linux_gnueabihf.a库可以用于开发webserver程序,/opt/goahead-2.5.0/LINUX目录下的main.c文件中webserver启动过程可以用于自己开发webserver程序的一部分,以Qt开发为例,可以单独创建一个线程QWebServerThread。

头文件qwebserverthread.h

class QWebServerThread : public QThread

{

  Q_OBJECT

public:

  QWebServerThread(QString strWeb,QString strIP,int nPort,int nRPort);

  ~QWebServerThread ();

  int initWeb();

  static int websHomePageHandler(webs_t wp, char_t *urlPrefix, char_t *webDir,int arg, char_t *url, char_t *path, char_t *query);

#ifdef B_STATS
  void memLeaks();
  void printMemStats(int handle, char_t *fmt, ...);
#endif

protected:

  void run();

private:

  QString strWeb;

  QString strIP;

  int nPort;

  int nRPort;

}

cpp文件qwebserverthread.cpp

#include "qwebserverthread.h"

WebServerThread::QWebServerThread(QString strWeb,QString strIP,int nPort)

{

  this->strWeb = WebRoot;

  this->strIP = strIP;

  this->nPort = nPort;

  this->nRPort = nRPort;

}

QWebServerThread::~QWebServerThread()

{

}

void QWebServerThread::run()

{ 

  /*
  *首先分配一个大的内存块(60*1024字节),以后只要是以b开头的对内存操作的函数都是在这个已经分好的内存块上的操作,这些操作在Balloc.c中实现。
  */
  bopen(NULL,(60 * 1024),B_USE_MALLOC);

  /*
  *忽略SIGPIPE信号
  */
  signal(SIGPIPE,SIG_IGN);

  /*
  *Initialize the web server
  *初始化用户管理部分,打开web服务器,注册URL处理函数。
  *用户管理部分在um.c中实现,
  *Web服务器的初始化是在default.c和webs.c中实现
  *url处理函数在handler.c中实现
  */
  if(initWeb() < 0)
  {
    printf("initWeb error.\n");
    return;
  }

  /*
  *初始化Ssl认证部分
  *注:在这个文档中对ssl认证不做研究
  */
  #ifdef WEBS_SSL_SUPPORT
  websSSLOpen();
  #endif

  /*
  * Basic event loop. SocketReady returns true when a socket is ready for
  * service. SocketSelect will block until an event occurs. SocketProcess
  * will actually do the servicing.
  */
  /*
  *主循环
  */
  while(getRunState())
  {
    /*
    1,socketReady()函数检查是否有准备好的sock事件
    2,socketSelect()函数首先把各个sock感兴趣的事件(sp->handlerMask)注册给三个集合(读,写,例外),然后调用select系统调用,然后更新各个sock的sp->currentEvents,表示各个sock的当前状态。
    这两个函数在sockGen.c中实现,他们主要操作的数据是socket_t变量socketList中的handlerMask和currentEvents,socketList在sock.c中定义并主要由该文件中的socketAlloc,socketFree和socketPtr三个函数维护。
    */
    if(socketReady(-1) || socketSelect(-1,1000))
    {
      /*
      该函数处理具体的sock事件
      1,调用socketReady(sid)对socketList[sid]进行检查,看是否有sock事件
      2,如果有sock事件,则调用socketDoEvent()函数,对事件进行处理
      */
      socketProcess(-1);
    }
    /*
    该函数在cgi.c中实现,检查cgiRec变量cgilist,首先把cgi的结果输出,如果有的话,然后看cgi进程是否已对号束,如果结束,就清理该cgi进程。
    Cgilist在函数websCgiHandler和websCgiCleanup中维护。
    */
    websCgiCleanup();
    /*
    该函数在websuemf.c中实现,功能是检查sched_t变量sched,断开超时的连接,sched变量在emfSchedCallback和emfUnschedCallback中维护
    */
    emfSchedProcess();
  }

  /*
  退出时的清理工作,永远不会执行到这里
  */
#ifdef WEBS_SSL_SUPPORT
  websSSLClose();
#endif

#ifdef USER_MANAGEMENT_SUPPORT
  umClose();
#endif

  //Close the socket module, report memory leaks and close the memory allocator
  websCloseServer();
  socketClose();
#ifdef B_STATS
  memLeaks();
#endif
  bclose();

}

int QWebServerThread::initWeb()
{

  //Initialize the socket subsystem
  socketOpen();

#ifdef USER_MANAGEMENT_SUPPORT
  /*
  * Initialize the User Management database
  */
  umOpen();
  umRestore((char_t*)_T("umconfig.txt"));
#endif

  /*
  * Define the local Ip address, host name, default home page and the
  * root web directory.
  */

  struct in_addr intaddr;

  intaddr.s_addr = inet_addr(strIP .toUtf8().data());

  /*
  * Set ../www as the root web
  */

  char *cp;

  char* dir = NULL;

  getcwd(dir, sizeof(dir));
  if ((cp = strrchr(dir, '/')))

   {
    *cp = '\0';
  }

  char* WebDir = NULL;
  sprintf(WebDir, "%s/%s", dir, strWeb.toUtf8().data());

  /*
  * Configure the web server options before opening the web server
  */
  websSetDefaultDir(pWebDir);

  SAVE_DELETE_ARRAY(dir);
  SAVE_DELETE_ARRAY(WebDir);

  char_t wbuf[128] = {0};  

  char *cp = inet_ntoa(intaddr);
  ascToUni(wbuf, cp, min(strlen(cp) + 1, sizeof(wbuf)));
  websSetIpaddr(wbuf);
  ascToUni(wbuf, host, min(strlen(host) + 1, sizeof(wbuf)));
  websSetHost(wbuf);

  /*
  * Configure the web server options before opening the web server
  */

  websSetDefaultPage("default.asp");
  websSetPassword( (char_t*)_T(""));

  /*
  * Open the web server on the given port. If that port is taken, try
  * the next sequential port for up to "retries" attempts.
  */
  websOpenServer(m_nPort, nRPort);

  /*
  * First create the URL handlers. Note: handlers are called in sorted order
  * with the longest path handler examined first. Here we define the security
  * handler, forms handler and the default web page handler.
  */
  websUrlHandlerDefine((char_t*)_T(""), NULL, 0, websSecurityHandler,WEBS_HANDLER_FIRST);
  websUrlHandlerDefine((char_t*)_T("/goform"), NULL, 0, websFormHandler, 0);
  websUrlHandlerDefine((char_t*)_T("/cgi-bin"), NULL, 0, websCgiHandler, 0);
  websUrlHandlerDefine((char_t*)_T(""), NULL, 0, websDefaultHandler,WEBS_HANDLER_LAST);

  /*
  * Now define two test procedures. Replace these with your application
  * relevant ASP script procedures and form functions.
  */
  registeredHandler(); //注册函数 如asp函数和表单处理函数(自定义函数)
  /*
  * Create the Form handlers for the User Management pages
  */
  #ifdef USER_MANAGEMENT_SUPPORT
  formDefineUserMgmt();
  #endif

  /*
  * Create a handler for the default home page
  */
  websUrlHandlerDefine((char_t*)_T("/"),NULL,0,websHomePageHandler,0);

  return 0;
}

//Home page handler
int QWebServerThread::websHomePageHandler(webs_t wp, char_t *urlPrefix, char_t *webDir,int arg, char_t *url, char_t *path, char_t *query)
{
  (void*)(urlPrefix);
  (void*)(webDir);
  (void*)(arg);
  (void*)(path);
  (void*)(query);

  //If the empty or "/" URL is invoked, redirect default URLs to the home page
  if(*url == '\0' || gstrcmp(url, (char_t*)_T("/")) == 0)
  {
    websRedirect(wp, (char_t*)WEBS_DEFAULT_HOME);
    return 1;
  }
  return 0;
}

#ifdef B_STATS
void QWebBase::memLeaks()
{
int fd;

if ((fd = gopen(_T("leak.txt"), O_CREAT | O_TRUNC | O_WRONLY, 0666)) >= 0) {
bstats(fd, printMemStats);
close(fd);
}
}

//Print memory usage / leaks
void QWebBase::printMemStats(int handle, char_t *fmt, ...)
{
va_list args;
char_t buf[256];

va_start(args, fmt);
vsprintf(buf, fmt, args);
va_end(args);
write(handle, buf, strlen(buf));
}
#endif

GoAhead2.5移植到ARM教程的更多相关文章

  1. Qt 4.7.2移植到ARM教程

    Qt的移植包括步骤如下: 1.下载并安装VMware WorkStation 12(最好比较高级的版本,早期的版本共享目录在虚拟机里可能显 示不了). 2.下载ubuntu 14.0.4(最好是lts ...

  2. iTOP-4412开发板-实战教程-ssh服务器移植到arm开发板

    本文转自迅为开发板:http://www.topeetboard.com 在前面实战教程中,移植了“串口文件传输工具”,整个移植过程是比较简单的,而且我 们没有做任何协议方面的了解,只是“配置”+“编 ...

  3. 【Linux开发】【Qt开发】ARM QT移植详细步骤教程

    ARM QT移植详细步骤教程 米尔SAM9X5和A5D3X上默认的Qt版本是4.5.3,当这个版本的Qt库不能满足实际开发需求时,可通过此方法制定Qt开发.运行环境. 移植的步骤如下: 1.下载新版q ...

  4. iTOP-IMX6UL 实战项目:ssh 服务器移植到 arm 开发板

    实验环境:迅为提供的Ubuntu12.04.2 以及虚拟机 编译器:arm-2009q3 编译器 开发板系统:QT系统   开发板使用手册中给Windows 系统安装了 ssh 客户端,给 Ubunt ...

  5. 将SQLite移植到ARM板上 (转)

    SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它, 它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够 ...

  6. 怎样将lua移植到arm平台的linux内核

    将脚本移植到内核是一件非常酷的事情,lua已经被移植到NetBSD的内核中,也有一个叫lunatik的项目把lua移植到了linux内核.仅仅可惜仅仅支持x86.不支持arm,在网上搜索了下,没有找到 ...

  7. SQL数据库移植到ARM板步骤

    SQL作为一种存储数据的数据结构,具有体积小(能堵存储的数据多),容易移植等优点.例如,在Ubuntu或者ARM开发板上被大量应用.下面就简单说一下SQL移植到ARM板的步骤. 下载源代码 (记得在家 ...

  8. W5200移植W5500驱动教程

    说明,移植例程为我按照这个教程移植的例程,测试通过.工程模板为我经常使用的一个w5500模板,可以在里面直接添加文件编程.1. 将driver文件夹中W5500文件夹和所有.c文件复制到工程/sour ...

  9. ffmpeg之移植到ARM

    移植方法分为两种:第一种手工移植,第二种buildroot移植. 第一种手工移植: 优点:灵活性高 缺点:重复工作多 一.配置 ./configure --enable-memalign-hack - ...

随机推荐

  1. re-sign重签名

    准备: ① re-sign.jar重签名工具:(下载地址为:http://troido.de/downloads/category/1): ② 从D:\Android\sdk\build-tools\ ...

  2. Awk基础

    Awk文本处理 awk是一种编程语言,用于在linux/unix下对文本和数据进行处理.awk数据可以来自标准输入.一个或多个文件,或其它命令的输出.awk通常是配合脚本进行使用, 是一个强大的文本处 ...

  3. An overview of gradient descent optimization algorithms (更新到Adam)

    Momentum:解快了收敛速度,同时也减弱了SGD的波动 NAG: 减速了Momentum更新参数太快 Adagrad: 出现频率较低参数采用较大的更新,对于出现频率较高的参数采用较小的,不共用一个 ...

  4. No.17 selenium学习之路之判断与等待

    一.三种等待方式 1.sleep 加载time库.time.sleep() 休眠单位以秒为单位 2.implicitly_wait() 等待页面完全加载完成(左上角转圈结束) 参数为等待时间,等待页面 ...

  5. AdvStringGrid 删除数据

    unit Unit6; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System ...

  6. Java事务管理之Spring+Hibernate

    环境与版本 除了上一篇中的hibernate的相关lib 外 Java事务管理之Hibernate 还需要加入Spring的lib 包和如下的一些依赖包 org.aopallianceorg.aspe ...

  7. MinGW-MSYS Bundle Win32编译ffmpeg 生成DLL并加入X264模块

    组件资源站点 1)MinGW-MSYS Bundle http://sourceforge.net/projects/mingwbundle/files/ 2)yasm汇编器 http://yasm. ...

  8. 20165333 预备作业3 Linux安装及学习

    预备作业3 Linux安装及学习 Linux系统安装 在老师的教程帮助下成功的完成了虚拟机的安装,但安装过程中也遇到了一些问题.在下载ubuntu时,总是下载失败,在求助同学后,在中文版官网的网址,才 ...

  9. 题解-python-CodeForces 1A

    A. Theatre Square time limit per test 2 seconds memory limit per test 64 megabytes input standard in ...

  10. 对于ElasticSearch与Hadoop是如何互相调用的?

    1.在HDFS中,数据是以文件形式保存的,比如JSON: https://blog.csdn.net/napoay/article/details/68945483 2.python读写HDFS,一般 ...