演讲嘉宾:现在我们的潜水 入分配代码 而看看上下文 在你的代码编写 将要被运行。 在一天结束时, 你要落实 Web服务器的全部。 但是,我们已经提供 你的骨架 码具有一些功能, 特别是与网络相关的。 让我们一起来看看。 所以在这里向顶部 该文件的是一串 功能测试宏要求。 现在,这是C,由此只是一个功能 根据一堆手册页 你必须定义一些 这些常数是真实的 或者甚至可以说具体的数字,这样 您可以访问特定的功能。 否则,他们将未申报 您将无法访问。 所以我用的方式做到了这一点 阅读手册页。 现在向下跌破,在 线15至17,我们 有一大堆宣布限制。 我们已经借了这些从 所谓的流行的Apache Web服务器。 而这些都只是 这将会号 封顶的总数 字节允许的 在各种情况下的HTTP请求 该浏览器允许给我。 接下来,我们定义字节。 现在,一个字节仅仅是一个奇特的方式 说法一个字节或8位。 原来在昔日一个字节 不一定八位, 所以字节总是八位。 所以在这种情况下,我们已经采取了 什么是常见的网络 世界呼唤八个字节一个字节的。 在这里,我指定的字节会 是512,这样,很像在取证 当我们读到了一堆 在时刻字节,这里也 我们要读 束的八位位组的时间。 接下来一大堆的头文件。 我怎么知道要包括这些? 好吧,我只是看过的人 对于许多功能的网页 我们将在这个配送使用 码,并在那些包括 我奉命。 现在我们有一个数据类型。 我们已经宣布的字节是一个字符。 我们将在后面看到,这是 通篇使用的代码。 我们已经申报了 一大堆原型, 我们将通过快速走 每个这样的功能。 最后,也许是最 重要的是保持在 介意此时在 的故事,是有 是,实际上是一个整 一堆全局变量 在该文件的顶部,根, CFD,SFD,要求,文件和身体。 现在普遍使用这么多全球 的变量,或者在所有的全局变量, 不是背面实践。 但事实证明,我们也使用 技术,称为信号处理后 在代码中,这使我们能够 当用户点击一些检测 像CTRL C和关闭 服务器正常。 而为了做到这一点优雅 实际上释放内存, 我们需要能够访问 这些全局变量。 现在让我们来看看主要的,这 推动这一计划的全部内容。 首先,在顶部在这里,我们 有一个错误编号变量 出现不 有型,但是这 因为它实际上是 在一个名为文件中定义 错误errno.h中哪些 包括更高了。 如果你做男人的errno实际 看到这个东西的定义, 你会看到,这是一个 特殊的全局变量 由一大堆设置 功能没有写 通过我们,但被Linux的作者 与其他系统实际设置 一个数字,该变量的东西时, 出了问题,这样你可以在全球 找出确实出问题。 现在,向下跌破,你会看到一个新的 技术也许使用getopt的, 一个功能,可帮助解析命令 行参数让我们不 费心浪费时间搞清楚 如何解析类似8080, 或破折号p或破折号小时,得到帮助。 getopt的本质确实是我们。 参见手册页了解更多。 接下来,我们做了一点错误 检查,以确保 该端口号​​是内 在指定范围内的规范。 接下来,我们看到了一个调用函数 开始,他的定义,我们将 看看一个时刻,正如它的名字 顾名思义,这将启动Web服务器。 在这里,我们有一个函数调用 所谓的信号说, 如果当你听到控制C来自 用户的键盘,继续打电话 一个函数调用的处理程序是怎么回事 最终干净的东西和停止 服务器。 下面是这似乎是一个 无限循环,第一线,其中 有效的是一个电话 一个调用的函数 复位,这是我们自己 为了实施以后 释放一些全球国家。 在这之后是一条线的 代码有条件 被检查返回 连接的价值。 现在,连看起来像一个谓语, 一些返回true或false。 而这样做,但有 一些特殊的连接 因为它是一个阻塞调用。 它会坐在那里,等待 直到用户的浏览器 尝试连接到该网络 服务器,然后才将它 返回true或false,所以我们开始 这个if语句的内部。 一到那里,看到这个功能了 函数调用的解析,这是我们写的, 这解析所有的八位字节,所有的 从浏览器传来的字节 到服务器,这样我们就可以出手 你回到最终值一 这些全局变量的那 所有门店,在短短的字节 那头 请求,而不是体 如果有一个真正的身体吧。 现在,向下跌破我们开始 解析这些头提取 的信息的子集 我们所关心的。 具体地,每 规范中,我们首先 想请求线,这是 只是第一个行 希望说,类似的get 削减或某些路径,然后HTTP 1.1。 我们使用这个比喻 在大海捞针的 寻找特定的 字符或地址。 事实上,还有一些 在我们的分销代码函数 你也可能会发现有用 寻找特定值时。 最终,我们复制这些字节 成可变称为线, 该通知,我们也已经 在堆栈上分配 通过动态调整数组的方式。 我们正在刻意 为了避免调用malloc 因为再次,因为 控制C是 这一计划的潜在功能,我们 不希望有这样的代码突然 由用户击打中断 控制C,它的结果 是,我可能没有机会 免费的东西我malloced。 所以我想用尽可能多 堆栈的是我可以在这里。 接下来,一大堆到DOS。 该规范将阐述 究竟怎么在这里期待, 但评论给你 一个什么样的暗示摆在面前。 你首先需要 验证请求行 并确保它看起来像 规范语法,可以这么说, 说它应该。 然后你需要提取的东西 所谓的查询中,出来的东西 问号之后,像 我们看到我们的谷歌的例子 在传递一个HD参数。 然后,我们一起串联 Web服务器的根 与这就是路径 这要求第一行 并形成的完整路径 在文件中,我们要看看的。 此后,我们要确保 该文件存在并且可读。 然后我们要提取其 文件扩展名,将.html或.PHP, 或一些这样的扩展,它是在 请求字符串的最末尾。 接下来是一个整体 一串代码,我们写了 实际生成PHP 为您生成的内容。 概括地说,这 在名称代码采用 该文件你想PHP解释。 我们通过一种叫做传递 管道进入PHP解释器。 找回响应,虽然 所述响应是一个文件本身。 然后我们遍历该文件的 字节,拉他们都到一个缓冲区 这样我们就可以最终 打印出来。 事实上,所有的这些 调用这里dprintf 可以让我们打印的东西 称为文件描述符,其 仅仅是一个整数 表示一个文件。 在精神上非常相似,但 从文件根本不同 明星指针。 请注意,您可以使用类似的语法 这里的printf,这样我可以动态 插入类似的长度 对于HTTP头的值 所谓内容长度。 最终我用了 功能权限,以实际编写 身体向请求。 不幸的是,我们只执行 动态支持 生成的PHP文件。 我们没有实施的支持 静态文件一样的GIF,和JPEG, 和CSS和HTML文件。 ,不幸的是,留给你 以向客户端作出响应的目的 此做。 因此,在那里你会发现,有 不就是块内的很多灵感, 但如果你稍微高了怎么 我们走遍解释PHP代码, 该功能将使用 有一点不同。 事实上,你可以借 一些功能 也许是从取证 习题集,因为 在一天结束时,所有你需要 这里做的是,一旦你知道什么文件打开 一旦你知道这是所谓的 MIME类型或内容类型 需要读取在这些字节 并以某种方式吐出他们回来了。 这和现在之旅 文件的其他功能。 截至第一连接, 它简单地返回true 当它终于听到 来自用户的连接。 接下来是错误。 错误,同时,作为一个功能我们 写来处理所有的不同的400 500 HTTP状态 你可能想码 以发送回用户, 连同一个标准报文。 接下来是负载,特别 肉香功能,其目的在生活中 被从文件中读取星的指针 文件的内容,成为一个全球性的缓冲 我们全局声明 上述[?主力。 ?] 这是一个有点复杂,因为我们 必须从文件中读取的字节 但检查在每次迭代 我们是否已把 命中的文件的末尾或 别的东西出现了问题。 而我们使用realloc的,以确保 无论我们使用缓冲区增长 并不断扩张,总是 字节数的保持领先 我们需要适合在那里。 处理程序,同时, ,获取功能 所谓由具有方式 注册的控制C作为信号 我们要拦截。 请注意这里的处理程序 它最终 电话停机,这当然 停止Web服务器。 不幸的是,查找 未实现。 在精神上,这是一个 很简单的功能。 给定一个文件扩展名,它需要 回到它的所谓的MIME 型或内容类型。 我们在规范中指定 什么映射必须是。 但你需要翻译 它最终为C代码。 接下来是我们同样肉香功能 所谓的解析,在生活中,其目的 是阅读,而不是从文件中, 但是从一个网络连接。 具体来说,读和解析 这是来自浏览器的HTTP请求 到服务器,这样 最终我们可以解析 在刚刚在请求中的报头 行,回到那些你 由全局缓冲器的方式 我们上面的[声明?主力。 ?] 复位,同时,是 函数,我们定义 这被称为内部迭代 主每一次你约 准备开始听 为一个新的连接 让我们总是知道 我们变量的状态 所以,我们也已经 释放任何内存 可能已被分配给 以前的网络连接。 接下来是启动时, 功能我们写 包含整个 大量的网络代码 最终启动Web服务器。 最后上来就是功能 所谓停止,这 正是这么做的,它 停止Web服务器。 但首先,它可以释放任何内存 仍然已经分配。 但它最终调用exit 甚至没有返回控制 我们的主要功能。 最终,所述一个 最重要的技术 当执行该Web服务器 将是一个有点试验和错误的, 有一个浏览器窗口打开 在右侧和在一个终端窗口 离开时,服务器控制台 窗口,这样就 可以看到,有消息 被显示在屏幕上。 但更好的是将第三 窗口中,第二个终端窗口, 在您使用Telnet的使用 对于该规定的规范。 和Telnet仅仅是一个很 简单的网络程序 可以让你假装 是在一个窗口中的浏览器 而谈话的另一个窗口。 这样,您就可以看到 正是文本命令 这都回来了 从服务器到客户端 无需戳 围绕Chrome的开发者 在另外的工具 笨重的接口。