127

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

4

12 回答 12

136

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

您必须以增量步骤实施的是:

  1. 让您的基本 TCP 套接字层运行(监听端口/端口,接受客户端连接和发送/接收数据)。
  2. 实现一个缓冲读取器,以便您一次可以读取一行(由 CRLF 分隔)的请求。
  3. 阅读第一行。解析出方法、请求版本和路径。
  4. 为“Header: value”语法实现标头解析。不要忘记展开折叠的标题。
  5. 检查请求方法、内容类型和内容大小以确定如何/是否读取正文。
  6. 实现基于内容类型的内容解码。
  7. 如果您要支持 HTTP 1.1,请实现诸如“100 Continue”、保持活动、分块传输之类的东西。
  8. 添加健壮性/安全措施,例如检测不完整的请求、限制最大客户端数量等。
  9. 收缩包装你的代码并开源它:)
于 2008-10-06T22:35:14.720 回答
95

我建议你看看tiny httpd。如果您想从头开始编写它,那么您需要彻底阅读RFC 2616。使用BSD 套接字在非常低的级别访问网络。

于 2008-10-06T22:13:39.443 回答
36

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

  • 打开 80 端口进行监听
  • 建立联系后,收集一些信息(主要获取 - 你现在可以忽略其余的)
  • 将请求翻译成文件请求
  • 打开文件并将其吐回客户端

根据您想要支持多少 HTTP,它变得更加困难 - POST 稍微复杂一点,脚本,处理多个请求等。

但是基础非常简单。

于 2008-10-06T22:15:34.510 回答
29

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

于 2008-10-06T22:30:51.877 回答
13

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

于 2008-10-06T22:12:41.710 回答
12

看看 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 云端硬盘。下面是代码下载:

https://drive.google.com/file/d/0B3msld7qnNOhSGZGdDJJMmY0VHM/view?usp=sharing&resourcekey=0-xkbf4mv0gN1sZrhBjt86UQ

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

于 2012-08-26T18:44:21.240 回答
5

我自己写了你可以使用的。这个作品有 sqlite,是线程安全的,并且是 C++ for UNIX。

您应该能够将其拆开并使用与 C 兼容的代码。

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

于 2008-10-06T22:12:55.140 回答
5

当我不得不为我的家庭作业做HTTP 规范Firebug时,它对我非常有用。

祝你好运。:)

于 2008-10-06T22:38:50.143 回答
4

我建议查看诸如lighthttpd之类的源代码。

于 2008-10-06T22:12:32.287 回答
2

http://www.manning.com/hethmon/ -- Manning 的“Illustrated Guide to HTTP by Paul S. Hethmon”是一本非常好的学习 HTTP 协议的书,对实现/扩展它的人非常有用。

于 2008-10-07T01:23:04.710 回答
1

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

于 2008-10-06T22:13:26.310 回答
1

更多响应的副本

尚未提及的一个候选者是spserver

于 2009-12-30T07:17:40.043 回答