【问题标题】:Build a simple HTTP server in C [closed]用 C 构建一个简单的 HTTP 服务器 [关闭]
【发布时间】:2008-10-06 22:10:24
【问题描述】:

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

【问题讨论】:

  • 这正是我的想法
  • 我现在也遇到了同样的问题。我用 this link 。希望这对你也有帮助。
  • 关于如何提问的FAQ 怎么样。你应该知道在代表 3K 之后这不是一个真正的问题,它怎么能得到这么多的赞成票?
  • 这显然是一个非常有用的问题。为什么关门了?

标签: c httpserver


【解决方案1】:

我建议你看看:A Practical Guide to Writing Clients and Servers

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

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

【讨论】:

  • 第 9 点,尤其是在此处发布问题后,+1 :)
  • 感谢您提供概念而不是预构建的解决方案或 RFC 和 Sockets 的链接。如果您没有这些概念,阅读 RFC 和了解 Sockets 并不足以构建您自己的 Web 服务器。
  • 使用“缓冲读取器”逐行读取请求(因此将行存储在缓冲区中,直到我们找到 CRLF),这让我对发送千兆字节的攻击感到焦虑没有 CRLF 的数据。为此,我通常使用“状态”读取,在移动中使用数据重新分配缓冲区,检查每次读取的限制并适当地发送 414。除了第 2 点,我同意所有其他点。
【解决方案2】:

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

【讨论】:

【解决方案3】:

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

  • 打开 80 端口进行监听
  • 建立联系后,收集一些信息(主要获取 - 您现在可以忽略其余部分)
  • 将请求转换为文件请求
  • 打开文件并吐回给客户端

这取决于您想要支持多少 HTTP 变得更加困难 - POST 稍微复杂一些,脚本、处理多个请求等等。

但是基础很简单。

【讨论】:

  • 感谢您提供概念而不是预构建的解决方案或 RFC 和 Sockets 的链接。如果您没有这些概念,阅读 RFC 和了解 Sockets 并不足以构建您自己的 Web 服务器。
【解决方案4】:

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

【讨论】:

    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

      看看 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/

      文章包括伪代码、解释和 cmets。

      编辑:IBM 的链接已失效。我已将网页的 PDF 保存到 Google Drive。下面是代码下载:

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

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

      【讨论】:

      • 嗯,不检查链接就投了赞成票:/ 我正在寻找您提到的确切内容,如果您找到了可以 ping 我的信息吗?文本
      • @samayo IBM 的链接已失效。我提供了一些镜子。
      • 这是 archive.org 的镜像 - 希望在未来几年内都可以使用:web.archive.org/web/20140905115151/http://www.ibm.com/…
      【解决方案7】:

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

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

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

      【讨论】:

        【解决方案8】:

        HTTP specFirebug 对我来说非常有用,因为我必须为 我的 做作业。

        祝你好运。 :)

        【讨论】:

          【解决方案9】:

          我建议查看lighthttpd 之类的来源。

          【讨论】:

            【解决方案10】:

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

            【讨论】:

              【解决方案11】:

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

              【讨论】:

                【解决方案12】:

                有一个duplicate with more responses

                尚未提及的候选人是spserver

                【讨论】:

                  猜你喜欢
                  • 2016-03-07
                  • 1970-01-01
                  • 2011-02-12
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-01-25
                  • 1970-01-01
                  • 2012-07-12
                  • 2017-10-15
                  相关资源
                  最近更新 更多