goahead源码解析(一) 从主函数到I/O事件循环

本文介绍了GoAhead,一个流行的小型嵌入式Web服务器,支持多种操作系统。文章深入解析了其主函数,说明了如何在单任务模式下处理连接,并详细阐述了I/O事件循环的工作原理,包括服务器如何监听和接受客户端连接,以及关键的socketEvent函数在HTTP协议处理中的作用。
摘要由CSDN通过智能技术生成

goahead源码解析(一) 从主函数到I/O事件循环

一、简介
  GoAhead is the world’s most popular, tiny embedded web server. It is compact, secure and simple to use. GoAhead is deployed in hundreds of millions of devices and is ideal for the smallest of embedded devices.
  根据官网描述,goahead为世界上最流行的,小型嵌入式web服务器。
  官网地址:https://www.embedthis.com/goahead/,官网截图如下:

在这里插入图片描述

  支持系统
   Linux (2.6+)
   Windows (7+)
   MAC OS X (10.7+)
   VxWorks (6.X+)
   FreeBSD (10.X+)
   Unix
  版本号:5.1.2
  是否开源:从官网看,暂未确认是否完全开源免费。

二、主函数

  2.1 单任务
   goahead用C语言实现,在main函数中使用单任务处理连接收发数据。对于嵌入式领域,不要求多线程高并发,此种框架可满足需求。
  2.2 main()函数定义
  函数定义如下,所在文件goahead-5.1.2\src\goahead.c,目前在linux系统中进行开发:

MAIN(goahead, int argc, char **argv, char **envp)
{
   
    char    *argp, *home, *documents, *endpoints, *endpoint, *route, *auth, *tok, *lspec;
    int     argind;

#if WINDOWS
    if (windowsInit() < 0) {
   
        return 0;
    }
#endif
    route = "route.txt";
    auth = "auth.txt";

    for (argind = 1; argind < argc; argind++) {
   
        argp = argv[argind];
        if (*argp != '-') {
   
            break;

        } else if (smatch(argp, "--auth") || smatch(argp, "-a")) {
   
            if (argind >= argc) usage();
            auth = argv[++argind];

#if ME_UNIX_LIKE && !MACOSX
        } else if (smatch(argp, "--background") || smatch(argp, "-b")) {
   
            websSetBackground(1);
#endif

        } else if (smatch(argp, "--debugger") || smatch(argp, "-d") || smatch(argp, "-D")) {
   
            websSetDebug(1);

        } else if (smatch(argp, "--home")) {
   
            if (argind >= argc) usage();
            home = argv[++argind];
            if (chdir(home) < 0) {
   
                error("Cannot change directory to %s", home);
                exit(-1);
            }
        } else if (smatch(argp, "--log") || smatch(argp, "-l")) {
   
            if (argind >= argc) usage();
            logSetPath(argv[++argind]);

        } else if (smatch(argp, "--verbose") || smatch(argp, "-v")) {
   
            logSetPath("stdout:2");

        } else if (smatch(argp, "--route") || smatch(argp, "-r")) {
   
            route = argv[++argind];

        } else if (smatch(argp, "--version") || smatch(argp, "
  • 8
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
http.c是goahead web服务器的核心文件之一,主要负责处理HTTP请求和响应。以下是http.c文件的源码解析: 1. 首先,http.c文件包含了一些必要的头文件,例如<sys/stat.h>和<fcntl.h>等。这些头文件提供了一些系统级别的函数和结构体。 2. 接着,http.c中定义了一些常量、宏和全局变量。例如,HTTP请求方法的枚举类型、HTTP响应状态码的宏定义、HTTP请求头部的结构体等。 3. 然后,http.c中定义了一些函数,这些函数负责处理HTTP请求和响应。例如,processHttpRequest()函数用于处理HTTP请求,sendHttpResponse()函数用于发送HTTP响应,parseFirstLine()函数用于解析HTTP请求的第一行等。 4. 在processHttpRequest()函数中,首先解析HTTP请求的第一行,然后解析HTTP请求头部,最后根据HTTP请求方法调用不同的处理函数。例如,如果是GET方法,就调用processGetRequest()函数处理请求。 5. 在processGetRequest()函数中,首先解析HTTP请求的路径,然后判断该路径是否合法,最后打开文件并发送HTTP响应。如果文件无法打开或者发送失败,就发送相应的错误响应。 6. 在sendHttpResponse()函数中,首先根据HTTP响应状态码设置响应头部,然后将响应头部和主体发送给客户端。 7. 最后,在main()函数中,启动goahead web服务器,并监听指定的端口号,等待客户端连接。 以上就是http.c文件的源码解析
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

同人与野

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值