在C中构建一个简单的HTTP服务器

Nat*_*n H 105 c httpserver

我需要在C中构建一个简单的HTTP服务器.任何指导?链接?样品?

Ate*_*ral 118

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

您必须在增量步骤中实现的是:

  1. 让您的基本TCP套接字层运行(侦听端口/端口,接受客户端连接并发送/接收数据).
  2. 实现缓冲读取器,以便您可以一次读取一行(由CRLF分隔)的请求.
  3. 阅读第一行.解析方法,请求版本和路径.
  4. 实现"Header:value"语法的头解析.不要忘记展开的折叠标题.
  5. 检查请求方法,内容类型和内容大小,以确定如何/是否将读取正文.
  6. 基于内容类型实现内容的解码.
  7. 如果您要支持HTTP 1.1,请执行"100 Continue",keep-alive,chunked transfer之类的操作.
  8. 添加健壮性/安全性措施,例如检测不完整的请求,限制最大数量的客户端等
  9. 收缩包装你的代码并开源它:)

  • 第 9 点,尤其是在这里发布问题之后,+1 :) (3认同)
  • 感谢您提供概念而不是预先构建的解决方案或 RFC 和套接字的链接。如果您没有牢记这些概念,那么阅读 RFC 并了解 Socket 不足以构建您自己的 Web 服务器。 (3认同)

Ada*_*eld 83

我建议你看一下微小的httpd.如果你想从头开始编写,那么你需要彻底阅读RFC 2616.使用BSD套接字以非常低的级别访问网络.

  • 现在不要阅读[RFC 2616](http://tools.ietf.org/html/rfc2616),它已被废弃:[RFC 7230](http://tools.ietf.org/html/rfc7230),[ RFC 7231](http://tools.ietf.org/html/rfc7231),[RFC 7232](http://tools.ietf.org/html/rfc7232),[RFC 7233](http:// tools. ietf.org/html/rfc7233),[RFC 7234](http://tools.ietf.org/html/rfc7234),[RFC 7235](http://tools.ietf.org/html/rfc7235) (21认同)
  • 或者使用inetd并跳过网络部分. (2认同)
  • `tiny httpd`也在github上:https://github.com/larryhe/tinyhttpd (2认同)

Ada*_*vis 26

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

  • 打开端口80进行收听
  • 联系时,收集一些信息(主要是 - 你现在可以忽略其余的)
  • 将请求转换为文件请求
  • 打开文件并将其吐回客户端

根据您希望支持多少HTTP,它会变得更加困难 - POST有点复杂,脚本,处理多个请求等等.

但基础非常简单.

  • 感谢您提供概念而不是预先构建的解决方案或 RFC 和套接字的链接。如果您没有牢记这些概念,那么阅读 RFC 并了解 Socket 不足以构建您自己的 Web 服务器。 (6认同)

Bob*_*ler 25

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


Ecl*_*pse 12

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


XP1*_*XP1 11

看看nweb(Nigel的Web服务器),"一个只有200行C源代码的小型,安全的Web服务器":

https://drive.google.com/file/d/0B3msld7qnNOhN1NXaFIwSFU2Mjg/view?usp=sharing http://www.ibm.com/developerworks/systems/library/es-nweb/

该文章包括伪代码,解释和注释.

编辑:IBM的链接已经死亡.我已将网页的PDF保存到Google云端硬盘.这是代码下载:

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

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


Dan*_*ite 5

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

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

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


Ome*_*ten 5

当我不得不做我的作业时,HTTP规范Firebug对我非常有用.

祝你好运.:)