用 C 语言构建一个简单的 HTTP 服务器

我需要在 C 中构建一个简单的 HTTP 服务器,有什么指导吗? 链接? 示例?

217803 次浏览

我建议从源头着手,比如 Lighttpd

在端口80上打开一个 TCP 套接字,开始监听新的连接,实现 这个。 根据你的目的,你可以忽略几乎所有的事情。最简单的方法是,您可以为每个请求发送相同的响应,这只需要将文本写入套接字即可。

我已经写了我自己的,你可以使用。这个工程有 sqlite,是线程安全的,并在 C + + 的 UNIX。

你应该能够把它分开,并使用 C 兼容的代码。

Http://code.google.com/p/mountain-cms/

使用特定于平台的套接字函数来封装 HTTP 协议,就像 阿帕奇人背后的人所做的那样。

我建议你看看 极小的超文本传输协议。如果您想从头开始编写它,那么您需要从 彻底读取 RFC 2616。使用 BSD 插座以非常低的级别访问网络。

HTTP 服务器在概念上很简单:

  • 打开80端口监听
  • 联系上之后,收集一些信息(主要是获取信息——其余的暂时可以忽略)
  • 将请求转换为文件请求
  • 打开文件并将其吐回给客户端

它变得更加困难,这取决于你想要支持多少 HTTP-POST 有点复杂,脚本,处理多个请求,等等。

但是基础很简单。

Mongoose (以前是简单的 HTTP 守护进程)非常好,特别是它是可嵌入的,可在 Windows、 Windows CE 和 UNIX 下编译。

我建议你看一下: 编写客户端和服务器的实用指南

你需要循序渐进地实现的是:

  1. 运行基本的 TCP 套接字层(监听端口/端口,接受客户端连接和发送/接收数据)。
  2. 实现一个缓冲读取器,这样您就可以一次读取一行请求(由 CRLF 分隔)。
  3. 阅读第一行,解析出方法、请求版本和路径。
  4. 实现“ Header: value”语法的 Header 解析。不要忘记展开 Header。
  5. 检查请求方法、内容类型和内容大小,以确定如何/是否读取正文。
  6. 实现基于内容类型的内容解码。
  7. 如果您打算支持 HTTP 1.1,那么可以实现“100 Continue”、 keep-alive、块传输等功能。
  8. 添加健壮性/安全性措施,如检测不完整的请求,限制最大客户端数量等。
  9. 收缩包装代码并开放源代码:)

HTTP 规范纵火犯对我来说非常有用,当我需要做 天啊作业的时候。

祝你好运

HTTP://www.Manning.com/Hethmon/ ——《保罗 · S · 赫斯蒙的 HTTP 插图指南》是一本学习 HTTP 协议的好书,对于实现/扩展 HTTP 协议的人来说非常有用。

有一个 以更多的响应重复

一个候选人尚未提及的是 监视器

看看 nweb (Nigel’s Web Server) ,“一个只有200行 C 源代码的小型、安全的 Web 服务器[ ... ]”:

Https://drive.google.com/file/d/0b3msld7qnnohn1nxafiwsfu2mjg/view?usp=sharing&resourcekey=0-ngy0nep78dxjklfv0pjodq Http://www.ibm.com/developerworks/systems/library/es-nweb/

本文包括伪代码、解释和注释。

编辑: IBM 的链接已经死亡。我已经保存了一个 PDF 的网页到谷歌驱动器。下面是代码下载:

Https://drive.google.com/file/d/0b3msld7qnnohsgzgddjjmmy0vhm/view?usp=sharing&resourcekey=0-xkbf4mv0gn1szrhbjt86uq

@ Ankushagarwal做了一些改动,并在 GitHub 上传了他的版本: Https://github.com/ankushagarwal/nweb