我需要在 C 中构建一个简单的 HTTP 服务器。有什么指导吗?链接?样品?
12 回答
我建议您看一下:编写客户端和服务器的实用指南
您必须以增量步骤实施的是:
- 让您的基本 TCP 套接字层运行(监听端口/端口,接受客户端连接和发送/接收数据)。
- 实现一个缓冲读取器,以便您一次可以读取一行(由 CRLF 分隔)的请求。
- 阅读第一行。解析出方法、请求版本和路径。
- 为“Header: value”语法实现标头解析。不要忘记展开折叠的标题。
- 检查请求方法、内容类型和内容大小以确定如何/是否读取正文。
- 实现基于内容类型的内容解码。
- 如果您要支持 HTTP 1.1,请实现诸如“100 Continue”、保持活动、分块传输之类的东西。
- 添加健壮性/安全措施,例如检测不完整的请求、限制最大客户端数量等。
- 收缩包装你的代码并开源它:)
我建议你看看tiny httpd。如果您想从头开始编写它,那么您需要彻底阅读RFC 2616。使用BSD 套接字在非常低的级别访问网络。
HTTP 服务器在概念上很简单:
- 打开 80 端口进行监听
- 建立联系后,收集一些信息(主要获取 - 你现在可以忽略其余的)
- 将请求翻译成文件请求
- 打开文件并将其吐回客户端
根据您想要支持多少 HTTP,它变得更加困难 - POST 稍微复杂一点,脚本,处理多个请求等。
但是基础非常简单。
Mongoose(以前的简单 HTTP 守护程序)非常好。特别是,它可以在 Windows、Windows CE 和 UNIX 下嵌入和编译。
在端口 80 上打开一个 TCP 套接字,开始监听新连接,实现这个。根据您的目的,您可以忽略几乎所有内容。最简单的情况是,您可以为每个请求发送相同的响应,这仅涉及将文本写入套接字。
看看 nweb(Nigel 的 Web 服务器),“一个只有 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 保存到 Google 云端硬盘。下面是代码下载:
@ankushagarwal做了一些改动,并在 GitHub 上上传了他的版本: https ://github.com/ankushagarwal/nweb
我自己写了你可以使用的。这个作品有 sqlite,是线程安全的,并且是 C++ for UNIX。
您应该能够将其拆开并使用与 C 兼容的代码。
当我不得不为我的家庭作业做HTTP 规范和Firebug时,它对我非常有用。
祝你好运。:)
我建议查看诸如lighthttpd之类的源代码。
http://www.manning.com/hethmon/ -- Manning 的“Illustrated Guide to HTTP by Paul S. Hethmon”是一本非常好的学习 HTTP 协议的书,对实现/扩展它的人非常有用。
使用平台特定的套接字函数来封装 HTTP 协议,就像Apache背后的人所做的那样。