【TinyHttpd学习笔记】500行的纯C语言Http服务器(含注释和webbench测试结果)

2023-11-06

Tinyhttpd是一个小型的http服务器实现,代码仅仅500行,我在大致过了一下unix环境编程之后就想找一个web服务器来练练手,这个就作为俺第一个web方向的小项目吧。
看完这个代码后准备研究一下muduo库、Nginx和Redis,上天保佑我能在秋招实习之前看完吧。

官方源文件:http://tinyhttpd.sourceforge.net/
注释后代码链接:https://github.com/Supredan/DanTinyHttpd
看完有帮助github上帮我点个star哦~磕头了!
参考了:https://github.com/qiyeboy/SourceAnalysis/tree/master/TinyHttpd,和https://github.com/cbsheng/tinyhttpd
感谢!

阅读这个程序需要UNIX编程的基础,包括socket相关API,多线程(虽然在Linux下没有用到),多进程和进程间通信,HTTP基础知识。

从main函数开始

int main(void)
{
   
	//在Ubuntu 16.04下运行,进行了修改
    int server_sock = -1;//服务器端fd
    u_short port = 0;//端口号,传0则随机绑定端口
    int client_sock = -1;//客户端fd
    struct sockaddr_in client_name;
    socklen_t  client_name_len = sizeof(client_name);
    pthread_t newthread;

    server_sock = startup(&port);//返回一个服务器端socket
    printf("httpd running on port %d\n", port);

	//不断循环接收连接请求
    while (1)
    {
   
        client_sock = accept(server_sock,
                (struct sockaddr *)&client_name,
                &client_name_len);//阻塞等待连接
        if (client_sock == -1)
            error_die("accept");
		//本来是线程版本,按照Linux注释修改,现在同一时间只能处理一个请求
		//应该是1999年Linux还没有线程的功能吧。。。
        //accept_request(&client_sock);//http请求的具体处理函数
        if (pthread_create(&newthread , NULL, accept_request, (void *)&client_sock) != 0)
            perror("pthread_create");
    }

	//关闭服务器端socket
    close(server_sock);

    return(0);
}

可以看到整个过程非常简单,注释写的很清楚了。
startup(&port);函数初始化后,处理的逻辑由accept_request(&client_sock);实现。

初始化函数startup(&port)

这个函数开启一个socket来监听特定端口的网络请求,输入参数为0时则动态生成一个端口号,否则用输入的参数做端口号。

int startup(u_short *port)
{
   
    int httpd = 0;
    int on = 1;
    struct sockaddr_in name;

    httpd = socket(PF_INET, SOCK_STREAM, 0);//创建socket
    if (httpd == -1)//创建失败处理
        error_die("socket");
    memset(&name, 0, sizeof(name));//清空name内容
	//设置name的参数,分别代表采用IPv4、端口的主机字节序转网络字节序、地址
    name.sin_family = AF_INET;
    name.sin_port = htons(*port);
    name.sin_addr.s_addr = htonl(INADDR_ANY);
	//设置端口复用
    if ((setsockopt(httpd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on))) < 0)  
    {
     
        error_die("setsockopt failed");
    }
	//绑定socket和地址
    if (bind(httpd, (struct sockaddr *)&name, sizeof(name)) < 0)
        error_die("bind");
	//如果传入参数为0,则动态分配端口,获取端口号并传出
    if (*port == 0)  /* if dynamically allocating a port */
    {
   
        socklen_t namelen 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【TinyHttpd学习笔记】500行的纯C语言Http服务器(含注释和webbench测试结果) 的相关文章

随机推荐

  • git 清除所有untracked file

    上次合并分支的时候 出现了一些没见过的文件 有 orig等等 如下图 接下来 就是git的神奇操作命令 git clean f 将所有untracked file 一次性删除 就大功告成了
  • upf低功耗的一个简单的例子

    一 结构描述 这里是一个uart top模块里面例化了两个uart 分别给两个模块给了power switch 用于电源控制 对这两个模块分别进行隔离关断来写一个简单的upf 二 代码分析 1 电压域 create power domain
  • python闭包

    python语言中形成闭包的三个条件 缺一不可 1 必须有一个内嵌函数 函数里定义的函数 这对应函数之间的嵌套 例如下面在函数funx 里面又定义了一个funy 函数 2 内嵌函数必须引用一个定义在闭合范围内 外部函数里 的变量 内部函数引
  • [ERR] Node 192.168.1.77:7000 is not empty. Either the node already knows other nodes (check with CLU

    ERR Node 192 168 1 77 7000 is not empty Either the node already knows other nodes check with CLUSTER NODES or contains s
  • AWS大数据三种经典玩法

    目录 前言 1 AWS一站式大数据分析平台 2 让人不得不喜欢的AWS 优点 缺点 3 个人建议 4 文章说明 一 AWS大数据平台全家桶简介 1 一首 数据源 2 一尾 数据应用 3 中间 大数据体系 3 1导入组件 3 2数据处理组件
  • 我跟面试官说MySQL单表数据量不要超过两千万,面试官不信

    导读 作为一个合格的 DBA 在遇到线上单表数据量超过千万级别的时候 往往会建议用户通过分表来缩减单表数据量 当用户问为什么单表数据量不能超过千万时 DBA 往往会说 单表数据量超过千万 会影响查询性能 知其然而不知所以然 学习技术不能停留
  • rtsp采用MD5加密摘要认证的交互过程

    RTSP使用MD5加密认证代码实现 链接 https edu csdn net learn 38258 606141 spm 1003 2001 3001 4157 RTSP实时音视频传输介绍 文章中详细介绍了RTSP实时音视频传输的过程
  • 车企为何要造手机?

    去年这个时候 有一个很火的词叫 互联网造车 当时百度 小米 阿里 滴滴等互联网公司纷纷宣布造车 而今年一开年 业界又出来一个热词 叫 车企造手机 吉利宣布要投入100亿来造手机 计划于2023年推出产品 最近又传出 吉利正在收购魅族手机 蔚
  • Microsoft Dynamics CRM Server 2011安装配置

    基于公司需要 要在服务器 Server 2008 R2 上安装CRM 老板想要安装Microsoft Dynamics CRM Server 2011 于是就去微软官网上下载了试用版进行安装调试 Microsoft Dynamics CRM
  • Python: 实现评分算法(附完整源代码)

    Python 实现评分算法 附完整源代码 评分是衡量产品或服务质量的指标之一 在许多领域中 评分都是非常重要的 例如电影 饭店 应用程序等 为了将产品或服务分类以便进行比较 我们需要使用评分算法 在本篇文章中 我们将介绍如何使用Python
  • Java并行流:一次搞定多线程编程难题,让你的程序飞起来!

    前言 在日常的工作中 为了提高程序的处理速度 充分利用多核处理器的性能 我们需要手动编写多线程代码 但是多线程编程非常复杂 容易出现死锁 竞态条件等问题 给我们带来了很大的困扰 而 Java 并行流则提供了一种更加简单 易用 安全的并发编程
  • Python读取json文件

    文章目录 一 JSON文件 二 读取JSON数据 一 JSON文件 准备一个json文档数据 把对应的参数添加至此json文件下 通过python去获取对应的数据 代码如下 示例 item requests url body
  • java.lang.UnsatisfiedLinkError: 错误记录

    java lang UnsatisfiedLinkError No implementation found for int com baidu platform comjni map commonmemcache JNICommonMem
  • STM32系列(HAL库)——F103C8T6通过IIC/I2C方式读写AT24C02—(EEPROM 存储模块)

    1 软件准备 1 编程平台 Keil5 2 CubeMX 3 XCOM 串口调试助手 2 硬件准备 1 AT24C02模块 2 F1的板子 本例使用经典F103C8T6 3 ST link 下载器 4 USB TTL模块 5 杜邦线若干 3
  • 美赛论文格式基本要求

    Your Paper s Title Starts Here Please Center use Helvetica Arial 14 论文的题目从这里开始 用Helvetica Arial 14号 FULL First Author1 a
  • Java中加载配置文件的三种方式

    一 通过文件路径加载 该方式必须知道文件的真实路径 1 配置文件放置位置 2 具体代码如下 package cn sunft day01 reflect import java io FileInputStream import java
  • OpenCV源码Android端编译,用时三天,我编了个寂寞。。。

    学更好的别人 做更好的自己 微卡智享 本文长度为1526字 预计阅读4分钟 导语 全网首发微信二维码引擎Android平台移植 中有介绍OpenCV源码及扩展模块Android端的编译 其中扩展模块里的人脸细节特征点是准备要测试看看的 于是
  • vi笔记附录1--vi之配置一个强大的c语言、python IED

    vi笔记附录1 vi之配置一个强大的c语言 python IED 2020 11 07 更新 三 vim特殊使用方法 12 NERDTree NERDTreeDirArrowExpandable 报错 一 vim效果图 话不多说 想知道vi
  • cocos2d-x学习笔记—图片按钮

    cpp view plain copy button cpp buttontest include MyButtonScene h include SimpleAudioEngine h using namespace cocos2d us
  • 【TinyHttpd学习笔记】500行的纯C语言Http服务器(含注释和webbench测试结果)

    目录 从main函数开始 初始化函数startup port 请求处理accept request client sock 请求行的处理 本地处理 测试结果 服务器功能测试 使用webbench测试 Tinyhttpd是一个小型的http服