东方向上 發表於 2019-5-24 12:19:00

Linux C编程之二十一 Linux高并发web服务器开发

<h3>一、HTML</h3>
<h3>1. HTML简介</h3>
<p><strong>(1)HTML简介</strong></p>
<ul>
<li>HTML,Hyper Texture Markup Language,超文本标记语言。</li>
<li>在计算机中以.html、.htm作为扩展名。</li>
<li>可以被浏览器访问, 就是经常见到的网页。</li>
</ul>
<p><strong>(2)HTML特点</strong></p>
<ul>
<li>语法非常简洁、比较松散,以相应的英语单词关键字进行组合</li>
<li>html标签不区分大小写</li>
<li>大多数标签是成对出现的, 有开始, 有结束,比如&lt;html&gt;&lt;/html&gt;</li>
<li>不成对出现的称之为短标签,比如&lt;br/&gt; &lt;hr/&gt;</li>
</ul>
<p><strong>(3)标签中的属性和属性值</strong></p>
<p>&nbsp; &nbsp; 属性="属性值"</p>
<ul>
<li>&nbsp;&lt;font color="red"&gt;hello, world&lt;/font&gt;</li>
<li>属性值建议加引号, (双, 单引号, 不加都可以)</li>
</ul>
<p><strong>(4)html组成部分</strong></p>
<ul>
<li>&lt;!doctype html&gt; 声明文档类型</li>
<li>&lt;html&gt;文档的头部好和主体内容 &lt;/html&gt; 根标记</li>
<li>&lt;head&gt; 文档的头部信息&lt;/head&gt; 头部标记 只能有一对</li>
<li>&lt;title&gt;显示在浏览器窗口的标题栏中“网页名称”&lt;/title&gt; 位于&lt;head&gt;标记之内</li>
<li>&lt;body&gt;&lt;/body&gt; 主体标记位于&lt;html&gt;之内,&lt;head&gt;标记之后</li>
</ul>
<p>&nbsp;示例:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">html</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">head</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">title</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>这是一个标题<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">title</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">head</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>

<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">body</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">font </span><span style="color: rgba(255, 0, 0, 1)">color</span><span style="color: rgba(0, 0, 255, 1)">="red"</span><span style="color: rgba(255, 0, 0, 1)"> size</span><span style="color: rgba(0, 0, 255, 1)">="5"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>hello, world<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">font</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">body</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">html</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span></pre>
</div>
<p><strong>(5)注释</strong></p>
<p>&nbsp; &nbsp; &lt;!-- 我是一个html注释 --&gt;</p>
<h3>2.&nbsp;文字和标题标签</h3>
<p><strong>(1)标题标签</strong></p>
<ul>
<li>&lt;h1&gt;&lt;/h1&gt; // 最大</li>
</ul>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 只有一个<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 搜索引擎优化:seo</p>
<ul>
<li>&lt;h2&gt;&lt;/h2&gt;</li>
<li>...</li>
<li>&lt;h6&gt;&lt;/h6&gt; // 最小</li>
<li>1-6依次变小, 自动换行</li>





</ul>
<p><strong>(2)文本标签</strong></p>
<ul>
<li>&lt;font&gt;&lt;/font&gt;</li>





</ul>
<p>&nbsp; &nbsp; &nbsp;属性:&nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; color: 文字颜色<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;表示方式:<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;英文单词: red green blue......<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;使用16进制的形式表示颜色: #ffffff-- (rgb)<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;使用rgb(255, 255, 0)<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; size: 文字大小<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 范围 1 -- 7<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 7最大<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1最小</p>
<p><strong>(3)文本格式化标签</strong></p>
<ul>
<li>文本加粗标签 </li>





</ul>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;strong&gt;&lt;/strong&gt; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;b&gt;&lt;/b&gt; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;工作里尽量使用strong</p>
<ul>
<li>文本倾斜标签 </li>





</ul>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;em&gt;&lt;/em&gt; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;i&gt;&lt;/i&gt; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;工作里尽量使用em</p>
<ul>
<li>删除线标签 </li>





</ul>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;del&gt;&lt;/del&gt; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;s&gt;&lt;/s&gt; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;工作里尽量使用del</p>
<ul>
<li>下划线标签(插入文本)</li>





</ul>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;ins&gt;&lt;/ins&gt; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;u&gt;&lt;/u&gt; <br>&nbsp; &nbsp; &nbsp; &nbsp; 工作里尽量ins</p>
<p><strong>(4)段落</strong></p>
<ul>
<li>&lt;p&gt;xxx&lt;/p&gt;</li>





</ul>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 特点:<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 上下自动生成空白行</p>
<p><strong>(5)块容器</strong></p>
<ul>
<li>&lt;div&gt;This is a div element.&lt;/div&gt;</li>
<li>用于没有语义含义的内容的块级容器(或网页的"划分")。</li>
<li>属性:对齐方式</li>





</ul>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; align:<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;left<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;center<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;right</p>
<p><strong>(6)换行</strong></p>
<ul>
<li>&lt;br/&gt;</li>





</ul>
<p><strong>(7)水平线</strong></p>
<ul>
<li>&lt;hr/&gt;</li>





</ul>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 属性:<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;color: 3种表示方法<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;size: 1-7<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 例如:&lt;hr color="red" size="3"/&gt;</p>
<h3>3.&nbsp;列表标签</h3>
<p><strong>(1)无序列表</strong><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;标签:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">ul</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">li</span><span style="color: rgba(0, 0, 255, 1)">&gt;&lt;/</span><span style="color: rgba(128, 0, 0, 1)">li</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span><span style="color: rgba(0, 0, 0, 1)"> 列表项
    </span><span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">li</span><span style="color: rgba(0, 0, 255, 1)">&gt;&lt;/</span><span style="color: rgba(128, 0, 0, 1)">li</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">ul</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span></pre>
</div>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;属性:type</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;实心圆圈: disc -- 默认<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;空心圆圈: circle<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;小方块: square</p>
<p><strong>(2)有序列表</strong></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;标签:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">ol</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">li</span><span style="color: rgba(0, 0, 255, 1)">&gt;&lt;/</span><span style="color: rgba(128, 0, 0, 1)">li</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span><span style="color: rgba(0, 0, 0, 1)"> 列表项
    </span><span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">li</span><span style="color: rgba(0, 0, 255, 1)">&gt;&lt;/</span><span style="color: rgba(128, 0, 0, 1)">li</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">ol</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span></pre>
</div>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;属性:</p>
<ul>
<li>type -- 序号</li>
</ul>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1 -- 默认<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; a<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; A<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;i   -- 罗马数字(小)<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;I   -- 罗马数字(大)</p>
<ul>
<li>start</li>





</ul>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 从序号的什么位置开始表示</p>
<p><strong>(3)自定义列表</strong><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;标签</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">dl</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">dt</span><span style="color: rgba(0, 0, 255, 1)">&gt;&lt;/</span><span style="color: rgba(128, 0, 0, 1)">dt</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span><span style="color: rgba(0, 0, 0, 1)"> 小标题
    </span><span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">dd</span><span style="color: rgba(0, 0, 255, 1)">&gt;&lt;/</span><span style="color: rgba(128, 0, 0, 1)">dd</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span><span style="color: rgba(0, 0, 0, 1)"> 解释标题
    </span><span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">dd</span><span style="color: rgba(0, 0, 255, 1)">&gt;&lt;/</span><span style="color: rgba(128, 0, 0, 1)">dd</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span><span style="color: rgba(0, 0, 0, 1)"> 解释标题
</span><span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">dl</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span></pre>
</div>
<h3>4. 图片标签</h3>
<ul>
<li>属性:</li>
</ul>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; src: 图片的来源 必写属性<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; alt: 替换文本 图片不显示的时候显示的文字<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; title: 提示文本 鼠标放到图片上显示的文字<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; width: 图片宽度<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; height: 图片高度</p>
<ul>
<li>注意:</li>





</ul>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 图片没有定义宽高的时候,图片按照百分之百比例显示<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 如果只更改图片的宽度或者高度,图片等比例缩放。</p>
<p>示例:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">img </span><span style="color: rgba(255, 0, 0, 1)">src</span><span style="color: rgba(0, 0, 255, 1)">="3.gif"</span><span style="color: rgba(255, 0, 0, 1)"> alt</span><span style="color: rgba(0, 0, 255, 1)">="小岳岳"</span><span style="color: rgba(255, 0, 0, 1)"> title</span><span style="color: rgba(0, 0, 255, 1)">="我的天呐!"</span><span style="color: rgba(255, 0, 0, 1)"> width</span><span style="color: rgba(0, 0, 255, 1)">="300"</span><span style="color: rgba(255, 0, 0, 1)"> height</span><span style="color: rgba(0, 0, 255, 1)">="200"</span> <span style="color: rgba(0, 0, 255, 1)">/&gt;</span></pre>
</div>
<h3>5. 超链接标签</h3>
<p><strong>(1)超链接标签</strong></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;a href="http://jd.com" title="A dog" target="_blank"&gt;超链接&lt;/a&gt;<br>&nbsp; &nbsp; 属性:<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; href: 去往的路径(跳转的页面)必写属性<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; title: 提示文本, 鼠标放到链接上显示的文字<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; target:<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_self:默认值 在自身页面打开(关闭自身页面,打开链接页面)<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_blank: 打开新页面 (自身页面不关闭,打开一个新的链接页面)<br>&nbsp; &nbsp; 示例:</p>
<div class="cnblogs_code">
<pre> <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">a </span><span style="color: rgba(255, 0, 0, 1)">href</span><span style="color: rgba(0, 0, 255, 1)">="http://www.baidu.com"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>百度一下<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">a</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span></pre>
</div>
<p><strong>(2)锚链接</strong></p>
<ul>
<li>先定义一个锚点: &lt;p id="sd"&gt;</li>
<li>超链接到锚点: &lt;a herf="#sd"&gt;回到顶点&lt;/a&gt;</li>
</ul>
<h3>(6)表格标签</h3>
<ul>
<li>&lt;table&gt;&lt;/table&gt;</li>
</ul>
<p>&nbsp; &nbsp; &nbsp; 属性:<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; border -- 表格线, 宽度1-7<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bordercolor -- 表格线颜色<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; width<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; height </p>
<ul>
<li>&lt;tr&gt; -- 行 </li>





</ul>
<p>&nbsp; &nbsp; &nbsp; 属性:<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; align -- 对齐方式:<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; center<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; left<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; right</p>
<ul>
<li>&lt;td&gt; -- 单元格(列)</li>





</ul>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 对其属性设置同tr</p>
<p>示例:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">table </span><span style="color: rgba(255, 0, 0, 1)">border</span><span style="color: rgba(0, 0, 255, 1)">=</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">tr</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">td</span><span style="color: rgba(0, 0, 255, 1)">&gt;&lt;/</span><span style="color: rgba(128, 0, 0, 1)">td</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span><span style="color: rgba(0, 0, 0, 1)"> 第一列
    </span><span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">td</span><span style="color: rgba(0, 0, 255, 1)">&gt;&lt;/</span><span style="color: rgba(128, 0, 0, 1)">td</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span><span style="color: rgba(0, 0, 0, 1)"> 第二列
</span><span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">tr</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>

<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">tr</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">td</span><span style="color: rgba(0, 0, 255, 1)">&gt;&lt;/</span><span style="color: rgba(128, 0, 0, 1)">td</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">td</span><span style="color: rgba(0, 0, 255, 1)">&gt;&lt;/</span><span style="color: rgba(128, 0, 0, 1)">td</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">tr</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>

<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">tr</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">td</span><span style="color: rgba(0, 0, 255, 1)">&gt;&lt;/</span><span style="color: rgba(128, 0, 0, 1)">td</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">td</span><span style="color: rgba(0, 0, 255, 1)">&gt;&lt;/</span><span style="color: rgba(128, 0, 0, 1)">td</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">tr</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">table</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span></pre>
</div>
<h3><strong>二、http协议 - 应用层</strong></h3>
<p><strong>1. 请求消息(Request) - 浏览器给服务器发</strong></p>
<p>&nbsp; &nbsp;四部分: 请求行, 请求头, 空行, 请求数据</p>
<ul>
<li>请求行: 说明请求类型, 要访问的资源, 以及使用的http版本</li>
<li>请求头: 说明服务器要使用的附加信息</li>
<li>空行: 空行是必须要有的, 即使没有请求数据</li>
<li>请求数据: 也叫主体, 可以添加任意的其他数据</li>
</ul>
<p>示例:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">GET /3.txt HTTP/1.1
    /: 资源目录的根目录
    三部分内容由空格间隔
Host: localhost:2222
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:24.0) Gecko/201001 01 Firefox/24.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
If-Modified-Since: Fri, 18 Jul 2014 08:36:36 GMT
    请求头:由键值对构成的

请求数据
换行:\r\n</span></pre>
</div>
<p><strong>2. 响应消息(Response) - 服务器给浏览器发&nbsp;&nbsp;</strong></p>
<p>&nbsp; &nbsp; 四部分: 状态行, 消息报头, 空行, 响应正文</p>
<ul>
<li>状态行: 包括http协议版本号, 状态码, 状态信息</li>
<li>消息报头: 说明客户端要使用的一些附加信息</li>
<li>空行: 空行是必须要有的</li>
<li>响应正文: 服务器返回给客户端的文本信息</li>
</ul>
<p>示例:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">HTTP/1.1 200 Ok
Server: micro_httpd
Date: Fri, 18 Jul 2014 14:34:26 GMT
<span style="color: rgba(255, 0, 0, 1)">Content-Type: text/plain; charset=iso-8859-1 (必选项)
    告诉浏览器发送的数据是什么类型
Content-Length: 32
    发送的数据的长度</span>
Content-Language: zh-CN
Last-Modified: Fri, 18 Jul 2014 08:36:36 GMT
Connection: close

#include </span><span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">stdio</span><span style="color: rgba(255, 0, 0, 1)">.h</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span><span style="color: rgba(0, 0, 0, 1)">
int main(void)
{
    printf("hello world!\n");
    return 0;
}</span></pre>
</div>
<p><strong>3. HTTP1.1的五种请求方法</strong></p>
<p>1)GET</p>
<p>&nbsp; &nbsp; &nbsp; 请求指定的页面信息,并返回实体主体。</p>
<p>2)POST</p>
<p>&nbsp; &nbsp; &nbsp; 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。</p>
<p>3)HEAD&nbsp;</p>
<p>&nbsp; &nbsp; &nbsp;类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头。</p>
<p>4)PUT</p>
<p>&nbsp; &nbsp; &nbsp;从客户端向服务器传送的数据取代指定的文档的内容。</p>
<p>5)DELETE</p>
<p>&nbsp; &nbsp; &nbsp;请求服务器删除指定的页面。</p>
<p>6)CONNECT</p>
<p>&nbsp; &nbsp; HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。</p>
<p>7)OPTIONS</p>
<p>&nbsp; &nbsp; 允许客户端查看服务器的性能。</p>
<p>8)TRACE</p>
<p>&nbsp; &nbsp; 回显服务器收到的请求,主要用于测试或诊断。</p>
<p><span style="color: rgba(255, 0, 0, 1)">示例:http使用get和post请求数据</span></p>
<ul>
<li><span style="color: rgba(0, 0, 0, 1)">使用get方法请求数据:</span></li>
</ul>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">GET /3.txt HTTP/1.1
Host: localhost:2222
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:24.0) Gecko/201001    01 Firefox/24.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
If-Modified-Since: Fri, 18 Jul 2014 08:36:36 GMT\r\n
空行
请求数据(可以为空)</span></pre>
</div>
<ul>
<li>使用post方法请求数据:</li>
</ul>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">POSTHTTP/1.1
Host: localhost:2222
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:24.0) Gecko/201001    01 Firefox/24.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
If-Modified-Since: Fri, 18 Jul 2014 08:36:36 GMT
空行
username=jack</span><span style="color: rgba(255, 0, 0, 1)">&amp;pwd</span>=123456<span style="color: rgba(255, 0, 0, 1)">&amp;sex</span>=男</pre>
</div>
<ul>
<li>浏览器地址栏:</li>
</ul>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">192.168.30.131/hello.c
浏览器封装一个http请求协议
get /hello.c http/1.1
key:value
key:value
key:value
key:value
\r\n</span></pre>
</div>
<p><strong>4. HTTP常用状态码</strong></p>
<p>&nbsp; &nbsp; 状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:</p>
<ul>
<li>1xx:指示信息--表示请求已接收,继续处理</li>
<li>2xx:成功--表示请求已被成功接收、理解、接受</li>
<li>3xx:重定向--要完成请求必须进行更进一步的操作</li>
<li>4xx:客户端错误--请求有语法错误或请求无法实现</li>
<li>5xx:服务器端错误--服务器未能实现合法的请求</li>
</ul>
<p>&nbsp; &nbsp; 常见状态码:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">200 OK 客户端请求成功
400 Bad Request 客户端请求有语法错误,不能被服务器所理解
401 Unauthorized 请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden 服务器收到请求,但是拒绝提供服务
404 Not Found 请求资源不存在,eg:输入了错误的URL
500 Internal Server Error 服务器发生不可预期的错误
503 Server Unavailable 服务器当前不能处理客户端的请求,一段时间后可能恢复正常</span></pre>
</div>
<p><strong>5. http中的文件类型</strong></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">普通文件: text/plain; charset=utf-8
*.html   : text/html; charset=utf-8
*.jpg    : image/jpeg
*.gif    : image/gif
*.png    : image/png
*.wav    : audio/wav
*.avi    : video/x-msvideo
*.mov    : video/quicktime
*.mp3    : audio/mpeg

charset=iso-8859-1    西欧的编码,说明网站采用的编码是英文;
charset=gb2312         说明网站采用的编码是简体中文;
charset=utf-8            代表世界通用的语言编码;
                                       可以用到中文、韩文、日文等世界上所有语言编码上
charset=euc-kr          说明网站采用的编码是韩文;
charset=big5             说明网站采用的编码是繁体中文;</span></pre>
</div>
<p><strong>6. 重定向</strong></p>
<p><img src="https://img2018.cnblogs.com/blog/1447858/201905/1447858-20190524171930381-2000186425.png"></p>
<h3>三、web服务器实现</h3>
<p><strong>1. 实现思路</strong></p>
<p>(1)编写函数解析http请求</p>
<p>&nbsp; &nbsp; GET /hello.html HTTP/1.1\r\n</p>
<p>&nbsp; &nbsp; 将上述字符串分为三部分解析出来</p>
<p>(2)编写函数根据文件后缀,返回对应的文件类型</p>
<p>(3)sscanf - 读取格式化的字符串中的数据</p>
<p>&nbsp; &nbsp; 使用正则表达式拆分<br>&nbsp; &nbsp; [^ ]的用法</p>
<p>(4)通过浏览器请求目录数据</p>
<ul>
<li>读指定目录内容</li>


</ul>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">opendir
readdir
closedir</span></pre>
</div>
<ul>
<li>scandir - 扫描dir目录下(不包括子目录)内容</li>
</ul>
<div class="cnblogs_code">
<pre>#include &lt;dirent.h&gt;

<span style="color: rgba(0, 0, 255, 1)">int</span> scandir(<span style="color: rgba(0, 0, 255, 1)">const</span> <span style="color: rgba(0, 0, 255, 1)">char</span> *<span style="color: rgba(0, 0, 0, 1)">dirp,
            </span><span style="color: rgba(0, 0, 255, 1)">struct</span> dirent ***<span style="color: rgba(0, 0, 0, 1)">namelist,
            </span><span style="color: rgba(0, 0, 255, 1)">int</span> (*filter)(<span style="color: rgba(0, 0, 255, 1)">const</span> <span style="color: rgba(0, 0, 255, 1)">struct</span> dirent *<span style="color: rgba(0, 0, 0, 1)">),
            </span><span style="color: rgba(0, 0, 255, 1)">int</span> (*compar)(<span style="color: rgba(0, 0, 255, 1)">const</span> <span style="color: rgba(0, 0, 255, 1)">struct</span> dirent **, <span style="color: rgba(0, 0, 255, 1)">const</span> <span style="color: rgba(0, 0, 255, 1)">struct</span> dirent **<span style="color: rgba(0, 0, 0, 1)">)
);
               
dirp
    </span>-<span style="color: rgba(0, 0, 0, 1)"> 当前要扫描的目录
namelist
    </span>- <span style="color: rgba(0, 0, 255, 1)">struct</span> dirent**<span style="color: rgba(0, 0, 0, 1)"> ptr;
    </span>- <span style="color: rgba(0, 0, 255, 1)">struct</span> dirent*<span style="color: rgba(0, 0, 0, 1)"> ptr[];
    </span>- &amp;<span style="color: rgba(0, 0, 0, 1)">ptr;
filter
    </span>-<span style="color: rgba(0, 0, 0, 1)"> NULL
compar
    文件名显示的时候, 指定排序规则
    </span>-<span style="color: rgba(0, 0, 0, 1)"> alphasort
    </span>- versionsort</pre>
</div>
<p>(5)http中数据特殊字符编码解码问题</p>
<p>&nbsp; &nbsp; 编码<br>&nbsp; &nbsp; 解码</p>
<p><span style="color: rgba(255, 0, 0, 1)">服务器端伪代码:</span></p>
<div class="cnblogs_code"><img id="code_img_closed_6aad893d-d2f6-4f63-9d2d-d3c0c4d46e60" class="code_img_closed lazyload" alt="" data-src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif"><img id="code_img_opened_6aad893d-d2f6-4f63-9d2d-d3c0c4d46e60" class="code_img_opened lazyload" style="display: none" alt="" data-src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif">
<div id="cnblogs_code_open_6aad893d-d2f6-4f63-9d2d-d3c0c4d46e60" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 0, 1)">void http_respond_head(int cfd, char* type)
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span> <span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(0, 128, 128, 1)"> 3</span> <span style="color: rgba(0, 0, 0, 1)">    char buf;
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span> <span style="color: rgba(0, 0, 0, 1)">    // 状态行
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span> <span style="color: rgba(0, 0, 0, 1)">    sprintf(buf, "http/1.1 200 OK\r\n");
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span> <span style="color: rgba(0, 0, 0, 1)">    write(cfd, buf, strlen(buf));
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span> <span style="color: rgba(0, 0, 0, 1)">    // 消息报头
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span> <span style="color: rgba(0, 0, 0, 1)">    sprintf(buf, "Content-Type: %s\r\n", type);
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span> <span style="color: rgba(0, 0, 0, 1)">    write(cfd, buf, strlen(buf));
</span><span style="color: rgba(0, 128, 128, 1)">10</span>   
<span style="color: rgba(0, 128, 128, 1)">11</span> <span style="color: rgba(0, 0, 0, 1)">    // 空行
</span><span style="color: rgba(0, 128, 128, 1)">12</span> <span style="color: rgba(0, 0, 0, 1)">    write(cfd, "\r\n", 2);
</span><span style="color: rgba(0, 128, 128, 1)">13</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">14</span>
<span style="color: rgba(0, 128, 128, 1)">15</span> <span style="color: rgba(0, 0, 0, 1)">void main()
</span><span style="color: rgba(0, 128, 128, 1)">16</span> <span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(0, 128, 128, 1)">17</span> <span style="color: rgba(0, 0, 0, 1)">    // 修改进程的工作目录
</span><span style="color: rgba(0, 128, 128, 1)">18</span> <span style="color: rgba(0, 0, 0, 1)">    chdir(path);
</span><span style="color: rgba(0, 128, 128, 1)">19</span> <span style="color: rgba(0, 0, 0, 1)">    // 创建监听的套接字
</span><span style="color: rgba(0, 128, 128, 1)">20</span> <span style="color: rgba(0, 0, 0, 1)">    int lfd = socket(af_inet, sock_stream, 0);
</span><span style="color: rgba(0, 128, 128, 1)">21</span> <span style="color: rgba(0, 0, 0, 1)">    // 绑定
</span><span style="color: rgba(0, 128, 128, 1)">22</span> <span style="color: rgba(0, 0, 0, 1)">    struct sockaddr_in serv;
</span><span style="color: rgba(0, 128, 128, 1)">23</span> <span style="color: rgba(0, 0, 0, 1)">    serv.family = af_inet;
</span><span style="color: rgba(0, 128, 128, 1)">24</span> <span style="color: rgba(0, 0, 0, 1)">    serv.port = htons(8989);
</span><span style="color: rgba(0, 128, 128, 1)">25</span>   bind(lfd, <span style="color: rgba(255, 0, 0, 1)">&amp;serv</span><span style="color: rgba(0, 0, 0, 1)">, len);
</span><span style="color: rgba(0, 128, 128, 1)">26</span> <span style="color: rgba(0, 0, 0, 1)">    // 监听
</span><span style="color: rgba(0, 128, 128, 1)">27</span> <span style="color: rgba(0, 0, 0, 1)">    listen();
</span><span style="color: rgba(0, 128, 128, 1)">28</span>   
<span style="color: rgba(0, 128, 128, 1)">29</span> <span style="color: rgba(0, 0, 0, 1)">    int cfd = accept();
</span><span style="color: rgba(0, 128, 128, 1)">30</span> <span style="color: rgba(0, 0, 0, 1)">    // 读数据
</span><span style="color: rgba(0, 128, 128, 1)">31</span> <span style="color: rgba(0, 0, 0, 1)">    read(cfd, buf, sizeof(buf));
</span><span style="color: rgba(0, 128, 128, 1)">32</span> <span style="color: rgba(0, 0, 0, 1)">    // 先将buf中的请求行拿出来
</span><span style="color: rgba(0, 128, 128, 1)">33</span> <span style="color: rgba(0, 0, 0, 1)">    // GET /hello.c http/1.1
</span><span style="color: rgba(0, 128, 128, 1)">34</span> <span style="color: rgba(0, 0, 0, 1)">    char method, path, protocol;
</span><span style="color: rgba(0, 128, 128, 1)">35</span> <span style="color: rgba(0, 0, 0, 1)">    // 得到文件名
</span><span style="color: rgba(0, 128, 128, 1)">36</span> <span style="color: rgba(0, 0, 0, 1)">    char* file = path+1;
</span><span style="color: rgba(0, 128, 128, 1)">37</span> <span style="color: rgba(0, 0, 0, 1)">    // 打开文件
</span><span style="color: rgba(0, 128, 128, 1)">38</span> <span style="color: rgba(0, 0, 0, 1)">    int fdd = open(file, O_RDONLY);
</span><span style="color: rgba(0, 128, 128, 1)">39</span> <span style="color: rgba(0, 0, 0, 1)">    int len = 0;
</span><span style="color: rgba(0, 128, 128, 1)">40</span> <span style="color: rgba(0, 0, 0, 1)">    http_respond_head(cfd, "text/plain");
</span><span style="color: rgba(0, 128, 128, 1)">41</span> <span style="color: rgba(0, 0, 0, 1)">    // 循环读数据
</span><span style="color: rgba(0, 128, 128, 1)">42</span> <span style="color: rgba(0, 0, 0, 1)">    while( (len=read(fdd, buf, sizeof(buf))) &gt; 0)
</span><span style="color: rgba(0, 128, 128, 1)">43</span> <span style="color: rgba(0, 0, 0, 1)">    {
</span><span style="color: rgba(0, 128, 128, 1)">44</span> <span style="color: rgba(0, 0, 0, 1)">      // 数据发送给浏览器
</span><span style="color: rgba(0, 128, 128, 1)">45</span> <span style="color: rgba(0, 0, 0, 1)">      write(fdd, buf, len));
</span><span style="color: rgba(0, 128, 128, 1)">46</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">47</span> }</pre>
</div>
<span class="cnblogs_code_collapse">服务器端伪代码</span></div>
<p><strong>2. 服务器端代码实现</strong></p>
<p><strong>&nbsp; &nbsp;</strong> 实现的是从浏览器输入比如:192.168.30.131:8000/home,服务端会将/home目录下的文件及文件夹返回到浏览器。</p>
<p><span style="color: rgba(255, 0, 0, 1)">&nbsp; &nbsp; 版本1:</span></p>
<div class="cnblogs_code"><img id="code_img_closed_e65e38b6-b9ad-49a6-be4d-daa04df308bd" class="code_img_closed lazyload" alt="" data-src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif"><img id="code_img_opened_e65e38b6-b9ad-49a6-be4d-daa04df308bd" class="code_img_opened lazyload" style="display: none" alt="" data-src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif">
<div id="cnblogs_code_open_e65e38b6-b9ad-49a6-be4d-daa04df308bd" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> #include &lt;stdio.h&gt;
<span style="color: rgba(0, 128, 128, 1)">2</span> #include &lt;unistd.h&gt;
<span style="color: rgba(0, 128, 128, 1)">3</span> #include &lt;stdlib.h&gt;
<span style="color: rgba(0, 128, 128, 1)">4</span> #include &lt;sys/types.h&gt;
<span style="color: rgba(0, 128, 128, 1)">5</span> #include &lt;<span style="color: rgba(0, 0, 255, 1)">string</span>.h&gt;
<span style="color: rgba(0, 128, 128, 1)">6</span> #include &lt;sys/epoll.h&gt;
<span style="color: rgba(0, 128, 128, 1)">7</span> #include &lt;arpa/inet.h&gt;
<span style="color: rgba(0, 128, 128, 1)">8</span> #include &lt;fcntl.h&gt;
<span style="color: rgba(0, 128, 128, 1)">9</span> #include &lt;dirent.h&gt;
<span style="color: rgba(0, 128, 128, 1)"> 10</span> #include &lt;sys/stat.h&gt;
<span style="color: rgba(0, 128, 128, 1)"> 11</span> #include &lt;ctype.h&gt;
<span style="color: rgba(0, 128, 128, 1)"> 12</span> #include <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">epoll_server.h</span><span style="color: rgba(128, 0, 0, 1)">"</span>
<span style="color: rgba(0, 128, 128, 1)"> 13</span>
<span style="color: rgba(0, 128, 128, 1)"> 14</span> <span style="color: rgba(0, 0, 255, 1)">#define</span> MAXSIZE 2000
<span style="color: rgba(0, 128, 128, 1)"> 15</span>
<span style="color: rgba(0, 128, 128, 1)"> 16</span> <span style="color: rgba(0, 0, 255, 1)">void</span> epoll_run(<span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> port)
</span><span style="color: rgba(0, 128, 128, 1)"> 17</span> <span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(0, 128, 128, 1)"> 18</span>   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 创建一个epoll树的根节点</span>
<span style="color: rgba(0, 128, 128, 1)"> 19</span>   <span style="color: rgba(0, 0, 255, 1)">int</span> epfd =<span style="color: rgba(0, 0, 0, 1)"> epoll_create(MAXSIZE);
</span><span style="color: rgba(0, 128, 128, 1)"> 20</span>   <span style="color: rgba(0, 0, 255, 1)">if</span>(epfd == -<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 21</span> <span style="color: rgba(0, 0, 0, 1)">    {
</span><span style="color: rgba(0, 128, 128, 1)"> 22</span>         perror(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">epoll_create error</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 23</span>         exit(<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 24</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)"> 25</span>
<span style="color: rgba(0, 128, 128, 1)"> 26</span>   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 添加要监听的节点
</span><span style="color: rgba(0, 128, 128, 1)"> 27</span>   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 先添加监听lfd</span>
<span style="color: rgba(0, 128, 128, 1)"> 28</span>   <span style="color: rgba(0, 0, 255, 1)">int</span> lfd =<span style="color: rgba(0, 0, 0, 1)"> init_listen_fd(port, epfd);
</span><span style="color: rgba(0, 128, 128, 1)"> 29</span>
<span style="color: rgba(0, 128, 128, 1)"> 30</span>   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 委托内核检测添加到树上的节点</span>
<span style="color: rgba(0, 128, 128, 1)"> 31</span>   <span style="color: rgba(0, 0, 255, 1)">struct</span><span style="color: rgba(0, 0, 0, 1)"> epoll_event all;
</span><span style="color: rgba(0, 128, 128, 1)"> 32</span>   <span style="color: rgba(0, 0, 255, 1)">while</span>(<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 33</span> <span style="color: rgba(0, 0, 0, 1)">    {
</span><span style="color: rgba(0, 128, 128, 1)"> 34</span>         <span style="color: rgba(0, 0, 255, 1)">int</span> ret = epoll_wait(epfd, all, MAXSIZE, -<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 35</span>         <span style="color: rgba(0, 0, 255, 1)">if</span>(ret == -<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 36</span> <span style="color: rgba(0, 0, 0, 1)">      {
</span><span style="color: rgba(0, 128, 128, 1)"> 37</span>             perror(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">epoll_wait error</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 38</span>             exit(<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 39</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)"> 40</span>
<span style="color: rgba(0, 128, 128, 1)"> 41</span>         <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 遍历发生变化的节点</span>
<span style="color: rgba(0, 128, 128, 1)"> 42</span>         <span style="color: rgba(0, 0, 255, 1)">for</span>(<span style="color: rgba(0, 0, 255, 1)">int</span> i=<span style="color: rgba(128, 0, 128, 1)">0</span>; i&lt;ret; ++<span style="color: rgba(0, 0, 0, 1)">i)
</span><span style="color: rgba(0, 128, 128, 1)"> 43</span> <span style="color: rgba(0, 0, 0, 1)">      {
</span><span style="color: rgba(0, 128, 128, 1)"> 44</span>             <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 只处理读事件, 其他事件默认不处理</span>
<span style="color: rgba(0, 128, 128, 1)"> 45</span>             <span style="color: rgba(0, 0, 255, 1)">struct</span> epoll_event *pev = &amp;<span style="color: rgba(0, 0, 0, 1)">all;
</span><span style="color: rgba(0, 128, 128, 1)"> 46</span>             <span style="color: rgba(0, 0, 255, 1)">if</span>(!(pev-&gt;events &amp;<span style="color: rgba(0, 0, 0, 1)"> EPOLLIN))
</span><span style="color: rgba(0, 128, 128, 1)"> 47</span> <span style="color: rgba(0, 0, 0, 1)">            {
</span><span style="color: rgba(0, 128, 128, 1)"> 48</span>               <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 不是读事件</span>
<span style="color: rgba(0, 128, 128, 1)"> 49</span>               <span style="color: rgba(0, 0, 255, 1)">continue</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 50</span> <span style="color: rgba(0, 0, 0, 1)">            }
</span><span style="color: rgba(0, 128, 128, 1)"> 51</span>
<span style="color: rgba(0, 128, 128, 1)"> 52</span>             <span style="color: rgba(0, 0, 255, 1)">if</span>(pev-&gt;data.fd ==<span style="color: rgba(0, 0, 0, 1)"> lfd)
</span><span style="color: rgba(0, 128, 128, 1)"> 53</span> <span style="color: rgba(0, 0, 0, 1)">            {
</span><span style="color: rgba(0, 128, 128, 1)"> 54</span>               <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 接受连接请求</span>
<span style="color: rgba(0, 128, 128, 1)"> 55</span> <span style="color: rgba(0, 0, 0, 1)">                do_accept(lfd, epfd);
</span><span style="color: rgba(0, 128, 128, 1)"> 56</span> <span style="color: rgba(0, 0, 0, 1)">            }
</span><span style="color: rgba(0, 128, 128, 1)"> 57</span>             <span style="color: rgba(0, 0, 255, 1)">else</span>
<span style="color: rgba(0, 128, 128, 1)"> 58</span> <span style="color: rgba(0, 0, 0, 1)">            {
</span><span style="color: rgba(0, 128, 128, 1)"> 59</span>               <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 读数据</span>
<span style="color: rgba(0, 128, 128, 1)"> 60</span>               do_read(pev-&gt;<span style="color: rgba(0, 0, 0, 1)">data.fd, epfd);
</span><span style="color: rgba(0, 128, 128, 1)"> 61</span> <span style="color: rgba(0, 0, 0, 1)">            }
</span><span style="color: rgba(0, 128, 128, 1)"> 62</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)"> 63</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)"> 64</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)"> 65</span>
<span style="color: rgba(0, 128, 128, 1)"> 66</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 读数据</span>
<span style="color: rgba(0, 128, 128, 1)"> 67</span> <span style="color: rgba(0, 0, 255, 1)">void</span> do_read(<span style="color: rgba(0, 0, 255, 1)">int</span> cfd, <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> epfd)
</span><span style="color: rgba(0, 128, 128, 1)"> 68</span> <span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(0, 128, 128, 1)"> 69</span>   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 将浏览器发过来的数据, 读到buf中 </span>
<span style="color: rgba(0, 128, 128, 1)"> 70</span>   <span style="color: rgba(0, 0, 255, 1)">char</span> line[<span style="color: rgba(128, 0, 128, 1)">1024</span>] = {<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">};
</span><span style="color: rgba(0, 128, 128, 1)"> 71</span>   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 读请求行</span>
<span style="color: rgba(0, 128, 128, 1)"> 72</span>   <span style="color: rgba(0, 0, 255, 1)">int</span> len = get_line(cfd, line, <span style="color: rgba(0, 0, 255, 1)">sizeof</span><span style="color: rgba(0, 0, 0, 1)">(line));
</span><span style="color: rgba(0, 128, 128, 1)"> 73</span>   <span style="color: rgba(0, 0, 255, 1)">if</span>(len == <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 74</span> <span style="color: rgba(0, 0, 0, 1)">    {
</span><span style="color: rgba(0, 128, 128, 1)"> 75</span>         printf(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">客户端断开了连接...\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 76</span>         <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 关闭套接字, cfd从epoll上del</span>
<span style="color: rgba(0, 128, 128, 1)"> 77</span> <span style="color: rgba(0, 0, 0, 1)">      disconnect(cfd, epfd);         
</span><span style="color: rgba(0, 128, 128, 1)"> 78</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)"> 79</span>   <span style="color: rgba(0, 0, 255, 1)">else</span>
<span style="color: rgba(0, 128, 128, 1)"> 80</span> <span style="color: rgba(0, 0, 0, 1)">    {
</span><span style="color: rgba(0, 128, 128, 1)"> 81</span>         printf(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">请求行数据: %s</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, line);
</span><span style="color: rgba(0, 128, 128, 1)"> 82</span>         printf(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">============= 请求头 ============\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 83</span>         <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 还有数据没读完
</span><span style="color: rgba(0, 128, 128, 1)"> 84</span>         <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 继续读</span>
<span style="color: rgba(0, 128, 128, 1)"> 85</span>         <span style="color: rgba(0, 0, 255, 1)">while</span><span style="color: rgba(0, 0, 0, 1)">(len)
</span><span style="color: rgba(0, 128, 128, 1)"> 86</span> <span style="color: rgba(0, 0, 0, 1)">      {
</span><span style="color: rgba(0, 128, 128, 1)"> 87</span>             <span style="color: rgba(0, 0, 255, 1)">char</span> buf[<span style="color: rgba(128, 0, 128, 1)">1024</span>] = {<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">};
</span><span style="color: rgba(0, 128, 128, 1)"> 88</span>             len = get_line(cfd, buf, <span style="color: rgba(0, 0, 255, 1)">sizeof</span><span style="color: rgba(0, 0, 0, 1)">(buf));
</span><span style="color: rgba(0, 128, 128, 1)"> 89</span>             printf(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">-----: %s</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, buf);
</span><span style="color: rgba(0, 128, 128, 1)"> 90</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)"> 91</span>         printf(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">============= The End ============\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 92</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)"> 93</span>
<span style="color: rgba(0, 128, 128, 1)"> 94</span>   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 请求行: get /xxx http/1.1
</span><span style="color: rgba(0, 128, 128, 1)"> 95</span>   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 判断是不是get请求</span>
<span style="color: rgba(0, 128, 128, 1)"> 96</span>   <span style="color: rgba(0, 0, 255, 1)">if</span>(strncasecmp(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">get</span><span style="color: rgba(128, 0, 0, 1)">"</span>, line, <span style="color: rgba(128, 0, 128, 1)">3</span>) == <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 97</span> <span style="color: rgba(0, 0, 0, 1)">    {
</span><span style="color: rgba(0, 128, 128, 1)"> 98</span>         <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 处理http请求</span>
<span style="color: rgba(0, 128, 128, 1)"> 99</span> <span style="color: rgba(0, 0, 0, 1)">      http_request(line, cfd);
</span><span style="color: rgba(0, 128, 128, 1)">100</span>         <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 关闭套接字, cfd从epoll上del</span>
<span style="color: rgba(0, 128, 128, 1)">101</span> <span style="color: rgba(0, 0, 0, 1)">      disconnect(cfd, epfd);         
</span><span style="color: rgba(0, 128, 128, 1)">102</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">103</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">104</span>
<span style="color: rgba(0, 128, 128, 1)">105</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 断开连接的函数</span>
<span style="color: rgba(0, 128, 128, 1)">106</span> <span style="color: rgba(0, 0, 255, 1)">void</span> disconnect(<span style="color: rgba(0, 0, 255, 1)">int</span> cfd, <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> epfd)
</span><span style="color: rgba(0, 128, 128, 1)">107</span> <span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(0, 128, 128, 1)">108</span>   <span style="color: rgba(0, 0, 255, 1)">int</span> ret =<span style="color: rgba(0, 0, 0, 1)"> epoll_ctl(epfd, EPOLL_CTL_DEL, cfd, NULL);
</span><span style="color: rgba(0, 128, 128, 1)">109</span>   <span style="color: rgba(0, 0, 255, 1)">if</span>(ret == -<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">110</span> <span style="color: rgba(0, 0, 0, 1)">    {
</span><span style="color: rgba(0, 128, 128, 1)">111</span>         perror(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">epoll_ctl del cfd error</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">112</span>         exit(<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">113</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">114</span> <span style="color: rgba(0, 0, 0, 1)">    close(cfd);
</span><span style="color: rgba(0, 128, 128, 1)">115</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">116</span>
<span style="color: rgba(0, 128, 128, 1)">117</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> http请求处理</span>
<span style="color: rgba(0, 128, 128, 1)">118</span> <span style="color: rgba(0, 0, 255, 1)">void</span> http_request(<span style="color: rgba(0, 0, 255, 1)">const</span> <span style="color: rgba(0, 0, 255, 1)">char</span>* request, <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> cfd)
</span><span style="color: rgba(0, 128, 128, 1)">119</span> <span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(0, 128, 128, 1)">120</span>   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 拆分http请求行
</span><span style="color: rgba(0, 128, 128, 1)">121</span>   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> get /xxx http/1.1</span>
<span style="color: rgba(0, 128, 128, 1)">122</span>   <span style="color: rgba(0, 0, 255, 1)">char</span> method[<span style="color: rgba(128, 0, 128, 1)">12</span>], path[<span style="color: rgba(128, 0, 128, 1)">1024</span>], protocol[<span style="color: rgba(128, 0, 128, 1)">12</span><span style="color: rgba(0, 0, 0, 1)">];
</span><span style="color: rgba(0, 128, 128, 1)">123</span>   sscanf(request, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">%[^ ] %[^ ] %[^ ]</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, method, path, protocol);
</span><span style="color: rgba(0, 128, 128, 1)">124</span>
<span style="color: rgba(0, 128, 128, 1)">125</span>   printf(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">method = %s, path = %s, protocol = %s\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, method, path, protocol);
</span><span style="color: rgba(0, 128, 128, 1)">126</span>
<span style="color: rgba(0, 128, 128, 1)">127</span>   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 转码 将不能识别的中文乱码 - &gt; 中文
</span><span style="color: rgba(0, 128, 128, 1)">128</span>   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 解码 %23 %34 %5f</span>
<span style="color: rgba(0, 128, 128, 1)">129</span> <span style="color: rgba(0, 0, 0, 1)">    decode_str(path, path);
</span><span style="color: rgba(0, 128, 128, 1)">130</span>         <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 处理path/xx
</span><span style="color: rgba(0, 128, 128, 1)">131</span>         <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 去掉path中的/</span>
<span style="color: rgba(0, 128, 128, 1)">132</span>         <span style="color: rgba(0, 0, 255, 1)">char</span>* file = path+<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">133</span>   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 如果没有指定访问的资源, 默认显示资源目录中的内容</span>
<span style="color: rgba(0, 128, 128, 1)">134</span>   <span style="color: rgba(0, 0, 255, 1)">if</span>(strcmp(path, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/</span><span style="color: rgba(128, 0, 0, 1)">"</span>) == <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">135</span> <span style="color: rgba(0, 0, 0, 1)">    {
</span><span style="color: rgba(0, 128, 128, 1)">136</span>         <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> file的值, 资源目录的当前位置</span>
<span style="color: rgba(0, 128, 128, 1)">137</span>         file = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">./</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">138</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">139</span>
<span style="color: rgba(0, 128, 128, 1)">140</span>   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 获取文件属性</span>
<span style="color: rgba(0, 128, 128, 1)">141</span>   <span style="color: rgba(0, 0, 255, 1)">struct</span><span style="color: rgba(0, 0, 0, 1)"> stat st;
</span><span style="color: rgba(0, 128, 128, 1)">142</span>   <span style="color: rgba(0, 0, 255, 1)">int</span> ret = stat(file, &amp;<span style="color: rgba(0, 0, 0, 1)">st);
</span><span style="color: rgba(0, 128, 128, 1)">143</span>   <span style="color: rgba(0, 0, 255, 1)">if</span>(ret == -<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">144</span> <span style="color: rgba(0, 0, 0, 1)">    {
</span><span style="color: rgba(0, 128, 128, 1)">145</span>         <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> show 404</span>
<span style="color: rgba(0, 128, 128, 1)">146</span>         send_respond_head(cfd, <span style="color: rgba(128, 0, 128, 1)">404</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">File Not Found</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">.html</span><span style="color: rgba(128, 0, 0, 1)">"</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">147</span>         send_file(cfd, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">404.html</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">148</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">149</span>
<span style="color: rgba(0, 128, 128, 1)">150</span>   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 判断是目录还是文件
</span><span style="color: rgba(0, 128, 128, 1)">151</span>   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 如果是目录</span>
<span style="color: rgba(0, 128, 128, 1)">152</span>   <span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)">(S_ISDIR(st.st_mode))
</span><span style="color: rgba(0, 128, 128, 1)">153</span> <span style="color: rgba(0, 0, 0, 1)">    {
</span><span style="color: rgba(0, 128, 128, 1)">154</span>         <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 发送头信息</span>
<span style="color: rgba(0, 128, 128, 1)">155</span>         send_respond_head(cfd, <span style="color: rgba(128, 0, 128, 1)">200</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">OK</span><span style="color: rgba(128, 0, 0, 1)">"</span>, get_file_type(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">.html</span><span style="color: rgba(128, 0, 0, 1)">"</span>), -<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">156</span>         <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 发送目录信息</span>
<span style="color: rgba(0, 128, 128, 1)">157</span> <span style="color: rgba(0, 0, 0, 1)">      send_dir(cfd, file);
</span><span style="color: rgba(0, 128, 128, 1)">158</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">159</span>   <span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)">(S_ISREG(st.st_mode))
</span><span style="color: rgba(0, 128, 128, 1)">160</span> <span style="color: rgba(0, 0, 0, 1)">    {
</span><span style="color: rgba(0, 128, 128, 1)">161</span>         <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 文件
</span><span style="color: rgba(0, 128, 128, 1)">162</span>         <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 发送消息报头</span>
<span style="color: rgba(0, 128, 128, 1)">163</span>         send_respond_head(cfd, <span style="color: rgba(128, 0, 128, 1)">200</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">OK</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, get_file_type(file), st.st_size);
</span><span style="color: rgba(0, 128, 128, 1)">164</span>         <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 发送文件内容</span>
<span style="color: rgba(0, 128, 128, 1)">165</span> <span style="color: rgba(0, 0, 0, 1)">      send_file(cfd, file);
</span><span style="color: rgba(0, 128, 128, 1)">166</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">167</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">168</span>
<span style="color: rgba(0, 128, 128, 1)">169</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 发送目录内容</span>
<span style="color: rgba(0, 128, 128, 1)">170</span> <span style="color: rgba(0, 0, 255, 1)">void</span> send_dir(<span style="color: rgba(0, 0, 255, 1)">int</span> cfd, <span style="color: rgba(0, 0, 255, 1)">const</span> <span style="color: rgba(0, 0, 255, 1)">char</span>*<span style="color: rgba(0, 0, 0, 1)"> dirname)
</span><span style="color: rgba(0, 128, 128, 1)">171</span> <span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(0, 128, 128, 1)">172</span>   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 拼一个html页面&lt;table&gt;&lt;/table&gt;</span>
<span style="color: rgba(0, 128, 128, 1)">173</span>   <span style="color: rgba(0, 0, 255, 1)">char</span> buf[<span style="color: rgba(128, 0, 128, 1)">4094</span>] = {<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">};
</span><span style="color: rgba(0, 128, 128, 1)">174</span>
<span style="color: rgba(0, 128, 128, 1)">175</span>   sprintf(buf, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">&lt;html&gt;&lt;head&gt;&lt;title&gt;目录名: %s&lt;/title&gt;&lt;/head&gt;</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, dirname);
</span><span style="color: rgba(0, 128, 128, 1)">176</span>   sprintf(buf+strlen(buf), <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">&lt;body&gt;&lt;h1&gt;当前目录: %s&lt;/h1&gt;&lt;table&gt;</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, dirname);
</span><span style="color: rgba(0, 128, 128, 1)">177</span>
<span style="color: rgba(0, 128, 128, 1)">178</span>   <span style="color: rgba(0, 0, 255, 1)">char</span> enstr[<span style="color: rgba(128, 0, 128, 1)">1024</span>] = {<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">};
</span><span style="color: rgba(0, 128, 128, 1)">179</span>   <span style="color: rgba(0, 0, 255, 1)">char</span> path[<span style="color: rgba(128, 0, 128, 1)">1024</span>] = {<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">};
</span><span style="color: rgba(0, 128, 128, 1)">180</span>   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 目录项二级指针</span>
<span style="color: rgba(0, 128, 128, 1)">181</span>   <span style="color: rgba(0, 0, 255, 1)">struct</span> dirent**<span style="color: rgba(0, 0, 0, 1)"> ptr;
</span><span style="color: rgba(0, 128, 128, 1)">182</span>   <span style="color: rgba(0, 0, 255, 1)">int</span> num = scandir(dirname, &amp;<span style="color: rgba(0, 0, 0, 1)">ptr, NULL, alphasort);
</span><span style="color: rgba(0, 128, 128, 1)">183</span>   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 遍历</span>
<span style="color: rgba(0, 128, 128, 1)">184</span>   <span style="color: rgba(0, 0, 255, 1)">for</span>(<span style="color: rgba(0, 0, 255, 1)">int</span> i=<span style="color: rgba(128, 0, 128, 1)">0</span>; i&lt;num; ++<span style="color: rgba(0, 0, 0, 1)">i)
</span><span style="color: rgba(0, 128, 128, 1)">185</span> <span style="color: rgba(0, 0, 0, 1)">    {
</span><span style="color: rgba(0, 128, 128, 1)">186</span>         <span style="color: rgba(0, 0, 255, 1)">char</span>* name = ptr-&gt;<span style="color: rgba(0, 0, 0, 1)">d_name;
</span><span style="color: rgba(0, 128, 128, 1)">187</span>
<span style="color: rgba(0, 128, 128, 1)">188</span>         <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 拼接文件的完整路径</span>
<span style="color: rgba(0, 128, 128, 1)">189</span>         sprintf(path, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">%s/%s</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, dirname, name);
</span><span style="color: rgba(0, 128, 128, 1)">190</span>         printf(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">path = %s ===================\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, path);
</span><span style="color: rgba(0, 128, 128, 1)">191</span>         <span style="color: rgba(0, 0, 255, 1)">struct</span><span style="color: rgba(0, 0, 0, 1)"> stat st;
</span><span style="color: rgba(0, 128, 128, 1)">192</span>         stat(path, &amp;<span style="color: rgba(0, 0, 0, 1)">st);
</span><span style="color: rgba(0, 128, 128, 1)">193</span>
<span style="color: rgba(0, 128, 128, 1)">194</span>         encode_str(enstr, <span style="color: rgba(0, 0, 255, 1)">sizeof</span><span style="color: rgba(0, 0, 0, 1)">(enstr), name);
</span><span style="color: rgba(0, 128, 128, 1)">195</span>         <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 如果是文件</span>
<span style="color: rgba(0, 128, 128, 1)">196</span>         <span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)">(S_ISREG(st.st_mode))
</span><span style="color: rgba(0, 128, 128, 1)">197</span> <span style="color: rgba(0, 0, 0, 1)">      {
</span><span style="color: rgba(0, 128, 128, 1)">198</span>             sprintf(buf+<span style="color: rgba(0, 0, 0, 1)">strlen(buf),
</span><span style="color: rgba(0, 128, 128, 1)">199</span>                     <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">&lt;tr&gt;&lt;td&gt;&lt;a href=\"%s\"&gt;%s&lt;/a&gt;&lt;/td&gt;&lt;td&gt;%ld&lt;/td&gt;&lt;/tr&gt;</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">200</span>                     enstr, name, (<span style="color: rgba(0, 0, 255, 1)">long</span><span style="color: rgba(0, 0, 0, 1)">)st.st_size);
</span><span style="color: rgba(0, 128, 128, 1)">201</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)">202</span>         <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 如果是目录</span>
<span style="color: rgba(0, 128, 128, 1)">203</span>         <span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)">(S_ISDIR(st.st_mode))
</span><span style="color: rgba(0, 128, 128, 1)">204</span> <span style="color: rgba(0, 0, 0, 1)">      {
</span><span style="color: rgba(0, 128, 128, 1)">205</span>             sprintf(buf+<span style="color: rgba(0, 0, 0, 1)">strlen(buf),
</span><span style="color: rgba(0, 128, 128, 1)">206</span>                     <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">&lt;tr&gt;&lt;td&gt;&lt;a href=\"%s/\"&gt;%s/&lt;/a&gt;&lt;/td&gt;&lt;td&gt;%ld&lt;/td&gt;&lt;/tr&gt;</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">207</span>                     enstr, name, (<span style="color: rgba(0, 0, 255, 1)">long</span><span style="color: rgba(0, 0, 0, 1)">)st.st_size);
</span><span style="color: rgba(0, 128, 128, 1)">208</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)">209</span>         send(cfd, buf, strlen(buf), <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">210</span>         memset(buf, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(0, 0, 255, 1)">sizeof</span><span style="color: rgba(0, 0, 0, 1)">(buf));
</span><span style="color: rgba(0, 128, 128, 1)">211</span>         <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 字符串拼接</span>
<span style="color: rgba(0, 128, 128, 1)">212</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">213</span>
<span style="color: rgba(0, 128, 128, 1)">214</span>   sprintf(buf+strlen(buf), <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">&lt;/table&gt;&lt;/body&gt;&lt;/html&gt;</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">215</span>   send(cfd, buf, strlen(buf), <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">216</span>
<span style="color: rgba(0, 128, 128, 1)">217</span>   printf(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">dir message send OK!!!!\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">218</span> <span style="color: rgba(0, 0, 255, 1)">#if</span> 0
<span style="color: rgba(0, 128, 128, 1)">219</span>   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 打开目录</span>
<span style="color: rgba(0, 128, 128, 1)">220</span>   DIR* dir =<span style="color: rgba(0, 0, 0, 1)"> opendir(dirname);
</span><span style="color: rgba(0, 128, 128, 1)">221</span>   <span style="color: rgba(0, 0, 255, 1)">if</span>(dir ==<span style="color: rgba(0, 0, 0, 1)"> NULL)
</span><span style="color: rgba(0, 128, 128, 1)">222</span> <span style="color: rgba(0, 0, 0, 1)">    {
</span><span style="color: rgba(0, 128, 128, 1)">223</span>         perror(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">opendir error</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">224</span>         exit(<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">225</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">226</span>
<span style="color: rgba(0, 128, 128, 1)">227</span>   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 读目录</span>
<span style="color: rgba(0, 128, 128, 1)">228</span>   <span style="color: rgba(0, 0, 255, 1)">struct</span> dirent* ptr =<span style="color: rgba(0, 0, 0, 1)"> NULL;
</span><span style="color: rgba(0, 128, 128, 1)">229</span>   <span style="color: rgba(0, 0, 255, 1)">while</span>( (ptr = readdir(dir)) !=<span style="color: rgba(0, 0, 0, 1)"> NULL )
</span><span style="color: rgba(0, 128, 128, 1)">230</span> <span style="color: rgba(0, 0, 0, 1)">    {
</span><span style="color: rgba(0, 128, 128, 1)">231</span>         <span style="color: rgba(0, 0, 255, 1)">char</span>* name = ptr-&gt;<span style="color: rgba(0, 0, 0, 1)">d_name;
</span><span style="color: rgba(0, 128, 128, 1)">232</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">233</span> <span style="color: rgba(0, 0, 0, 1)">    closedir(dir);
</span><span style="color: rgba(0, 128, 128, 1)">234</span> <span style="color: rgba(0, 0, 255, 1)">#endif</span>
<span style="color: rgba(0, 128, 128, 1)">235</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">236</span>
<span style="color: rgba(0, 128, 128, 1)">237</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 发送响应头</span>
<span style="color: rgba(0, 128, 128, 1)">238</span> <span style="color: rgba(0, 0, 255, 1)">void</span> send_respond_head(<span style="color: rgba(0, 0, 255, 1)">int</span> cfd, <span style="color: rgba(0, 0, 255, 1)">int</span> no, <span style="color: rgba(0, 0, 255, 1)">const</span> <span style="color: rgba(0, 0, 255, 1)">char</span>* desp, <span style="color: rgba(0, 0, 255, 1)">const</span> <span style="color: rgba(0, 0, 255, 1)">char</span>* type, <span style="color: rgba(0, 0, 255, 1)">long</span><span style="color: rgba(0, 0, 0, 1)"> len)
</span><span style="color: rgba(0, 128, 128, 1)">239</span> <span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(0, 128, 128, 1)">240</span>   <span style="color: rgba(0, 0, 255, 1)">char</span> buf[<span style="color: rgba(128, 0, 128, 1)">1024</span>] = {<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">};
</span><span style="color: rgba(0, 128, 128, 1)">241</span>   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 状态行</span>
<span style="color: rgba(0, 128, 128, 1)">242</span>   sprintf(buf, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">http/1.1 %d %s\r\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, no, desp);
</span><span style="color: rgba(0, 128, 128, 1)">243</span>   send(cfd, buf, strlen(buf), <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">244</span>   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 消息报头</span>
<span style="color: rgba(0, 128, 128, 1)">245</span>   sprintf(buf, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Content-Type:%s\r\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, type);
</span><span style="color: rgba(0, 128, 128, 1)">246</span>   sprintf(buf+strlen(buf), <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Content-Length:%ld\r\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, len);
</span><span style="color: rgba(0, 128, 128, 1)">247</span>   send(cfd, buf, strlen(buf), <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">248</span>   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 空行</span>
<span style="color: rgba(0, 128, 128, 1)">249</span>   send(cfd, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">\r\n</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 128, 1)">2</span>, <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">250</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">251</span>
<span style="color: rgba(0, 128, 128, 1)">252</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 发送文件</span>
<span style="color: rgba(0, 128, 128, 1)">253</span> <span style="color: rgba(0, 0, 255, 1)">void</span> send_file(<span style="color: rgba(0, 0, 255, 1)">int</span> cfd, <span style="color: rgba(0, 0, 255, 1)">const</span> <span style="color: rgba(0, 0, 255, 1)">char</span>*<span style="color: rgba(0, 0, 0, 1)"> filename)
</span><span style="color: rgba(0, 128, 128, 1)">254</span> <span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(0, 128, 128, 1)">255</span>   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 打开文件</span>
<span style="color: rgba(0, 128, 128, 1)">256</span>   <span style="color: rgba(0, 0, 255, 1)">int</span> fd =<span style="color: rgba(0, 0, 0, 1)"> open(filename, O_RDONLY);
</span><span style="color: rgba(0, 128, 128, 1)">257</span>   <span style="color: rgba(0, 0, 255, 1)">if</span>(fd == -<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">258</span> <span style="color: rgba(0, 0, 0, 1)">    {
</span><span style="color: rgba(0, 128, 128, 1)">259</span>         <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> show 404</span>
<span style="color: rgba(0, 128, 128, 1)">260</span>         <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">261</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">262</span>
<span style="color: rgba(0, 128, 128, 1)">263</span>   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 循环读文件</span>
<span style="color: rgba(0, 128, 128, 1)">264</span>   <span style="color: rgba(0, 0, 255, 1)">char</span> buf[<span style="color: rgba(128, 0, 128, 1)">4096</span>] = {<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">};
</span><span style="color: rgba(0, 128, 128, 1)">265</span>   <span style="color: rgba(0, 0, 255, 1)">int</span> len = <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">266</span>   <span style="color: rgba(0, 0, 255, 1)">while</span>( (len = read(fd, buf, <span style="color: rgba(0, 0, 255, 1)">sizeof</span>(buf))) &gt; <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)"> )
</span><span style="color: rgba(0, 128, 128, 1)">267</span> <span style="color: rgba(0, 0, 0, 1)">    {
</span><span style="color: rgba(0, 128, 128, 1)">268</span>         <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 发送读出的数据</span>
<span style="color: rgba(0, 128, 128, 1)">269</span>         send(cfd, buf, len, <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">270</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">271</span>   <span style="color: rgba(0, 0, 255, 1)">if</span>(len == -<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">272</span> <span style="color: rgba(0, 0, 0, 1)">    {
</span><span style="color: rgba(0, 128, 128, 1)">273</span>         perror(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">read file error</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">274</span>         exit(<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">275</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">276</span>
<span style="color: rgba(0, 128, 128, 1)">277</span> <span style="color: rgba(0, 0, 0, 1)">    close(fd);
</span><span style="color: rgba(0, 128, 128, 1)">278</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">279</span>
<span style="color: rgba(0, 128, 128, 1)">280</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 解析http请求消息的每一行内容</span>
<span style="color: rgba(0, 128, 128, 1)">281</span> <span style="color: rgba(0, 0, 255, 1)">int</span> get_line(<span style="color: rgba(0, 0, 255, 1)">int</span> sock, <span style="color: rgba(0, 0, 255, 1)">char</span> *buf, <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> size)
</span><span style="color: rgba(0, 128, 128, 1)">282</span> <span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(0, 128, 128, 1)">283</span>   <span style="color: rgba(0, 0, 255, 1)">int</span> i = <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">284</span>   <span style="color: rgba(0, 0, 255, 1)">char</span> c = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">\0</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">285</span>   <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> n;
</span><span style="color: rgba(0, 128, 128, 1)">286</span>   <span style="color: rgba(0, 0, 255, 1)">while</span> ((i &lt; size - <span style="color: rgba(128, 0, 128, 1)">1</span>) &amp;&amp; (c != <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">\n</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">))
</span><span style="color: rgba(0, 128, 128, 1)">287</span> <span style="color: rgba(0, 0, 0, 1)">    {
</span><span style="color: rgba(0, 128, 128, 1)">288</span>         n = recv(sock, &amp;c, <span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">289</span>         <span style="color: rgba(0, 0, 255, 1)">if</span> (n &gt; <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">290</span> <span style="color: rgba(0, 0, 0, 1)">      {
</span><span style="color: rgba(0, 128, 128, 1)">291</span>             <span style="color: rgba(0, 0, 255, 1)">if</span> (c == <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">\r</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">292</span> <span style="color: rgba(0, 0, 0, 1)">            {
</span><span style="color: rgba(0, 128, 128, 1)">293</span>               n = recv(sock, &amp;c, <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">, MSG_PEEK);
</span><span style="color: rgba(0, 128, 128, 1)">294</span>               <span style="color: rgba(0, 0, 255, 1)">if</span> ((n &gt; <span style="color: rgba(128, 0, 128, 1)">0</span>) &amp;&amp; (c == <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">\n</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">))
</span><span style="color: rgba(0, 128, 128, 1)">295</span> <span style="color: rgba(0, 0, 0, 1)">                {
</span><span style="color: rgba(0, 128, 128, 1)">296</span>                     recv(sock, &amp;c, <span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">297</span> <span style="color: rgba(0, 0, 0, 1)">                }
</span><span style="color: rgba(0, 128, 128, 1)">298</span>               <span style="color: rgba(0, 0, 255, 1)">else</span>
<span style="color: rgba(0, 128, 128, 1)">299</span> <span style="color: rgba(0, 0, 0, 1)">                {
</span><span style="color: rgba(0, 128, 128, 1)">300</span>                     c = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">\n</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">301</span> <span style="color: rgba(0, 0, 0, 1)">                }
</span><span style="color: rgba(0, 128, 128, 1)">302</span> <span style="color: rgba(0, 0, 0, 1)">            }
</span><span style="color: rgba(0, 128, 128, 1)">303</span>             buf =<span style="color: rgba(0, 0, 0, 1)"> c;
</span><span style="color: rgba(0, 128, 128, 1)">304</span>             i++<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">305</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)">306</span>         <span style="color: rgba(0, 0, 255, 1)">else</span>
<span style="color: rgba(0, 128, 128, 1)">307</span> <span style="color: rgba(0, 0, 0, 1)">      {
</span><span style="color: rgba(0, 128, 128, 1)">308</span>             c = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">\n</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">309</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)">310</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">311</span>   buf = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">\0</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">312</span>
<span style="color: rgba(0, 128, 128, 1)">313</span>   <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> i;
</span><span style="color: rgba(0, 128, 128, 1)">314</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">315</span>
<span style="color: rgba(0, 128, 128, 1)">316</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 接受新连接处理</span>
<span style="color: rgba(0, 128, 128, 1)">317</span> <span style="color: rgba(0, 0, 255, 1)">void</span> do_accept(<span style="color: rgba(0, 0, 255, 1)">int</span> lfd, <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> epfd)
</span><span style="color: rgba(0, 128, 128, 1)">318</span> <span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(0, 128, 128, 1)">319</span>   <span style="color: rgba(0, 0, 255, 1)">struct</span><span style="color: rgba(0, 0, 0, 1)"> sockaddr_in client;
</span><span style="color: rgba(0, 128, 128, 1)">320</span>   socklen_t len = <span style="color: rgba(0, 0, 255, 1)">sizeof</span><span style="color: rgba(0, 0, 0, 1)">(client);
</span><span style="color: rgba(0, 128, 128, 1)">321</span>   <span style="color: rgba(0, 0, 255, 1)">int</span> cfd = accept(lfd, (<span style="color: rgba(0, 0, 255, 1)">struct</span> sockaddr*)&amp;client, &amp;<span style="color: rgba(0, 0, 0, 1)">len);
</span><span style="color: rgba(0, 128, 128, 1)">322</span>   <span style="color: rgba(0, 0, 255, 1)">if</span>(cfd == -<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">323</span> <span style="color: rgba(0, 0, 0, 1)">    {
</span><span style="color: rgba(0, 128, 128, 1)">324</span>         perror(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">accept error</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">325</span>         exit(<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">326</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">327</span>
<span style="color: rgba(0, 128, 128, 1)">328</span>   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 打印客户端信息</span>
<span style="color: rgba(0, 128, 128, 1)">329</span>   <span style="color: rgba(0, 0, 255, 1)">char</span> ip[<span style="color: rgba(128, 0, 128, 1)">64</span>] = {<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">};
</span><span style="color: rgba(0, 128, 128, 1)">330</span>   printf(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">New Client IP: %s, Port: %d, cfd = %d\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">331</span>            inet_ntop(AF_INET, &amp;client.sin_addr.s_addr, ip, <span style="color: rgba(0, 0, 255, 1)">sizeof</span><span style="color: rgba(0, 0, 0, 1)">(ip)),
</span><span style="color: rgba(0, 128, 128, 1)">332</span> <span style="color: rgba(0, 0, 0, 1)">         ntohs(client.sin_port), cfd);
</span><span style="color: rgba(0, 128, 128, 1)">333</span>
<span style="color: rgba(0, 128, 128, 1)">334</span>   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 设置cfd为非阻塞</span>
<span style="color: rgba(0, 128, 128, 1)">335</span>   <span style="color: rgba(0, 0, 255, 1)">int</span> flag =<span style="color: rgba(0, 0, 0, 1)"> fcntl(cfd, F_GETFL);
</span><span style="color: rgba(0, 128, 128, 1)">336</span>   flag |=<span style="color: rgba(0, 0, 0, 1)"> O_NONBLOCK;
</span><span style="color: rgba(0, 128, 128, 1)">337</span> <span style="color: rgba(0, 0, 0, 1)">    fcntl(cfd, F_SETFL, flag);
</span><span style="color: rgba(0, 128, 128, 1)">338</span>
<span style="color: rgba(0, 128, 128, 1)">339</span>   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 得到的新节点挂到epoll树上</span>
<span style="color: rgba(0, 128, 128, 1)">340</span>   <span style="color: rgba(0, 0, 255, 1)">struct</span><span style="color: rgba(0, 0, 0, 1)"> epoll_event ev;
</span><span style="color: rgba(0, 128, 128, 1)">341</span>   ev.data.fd =<span style="color: rgba(0, 0, 0, 1)"> cfd;
</span><span style="color: rgba(0, 128, 128, 1)">342</span>   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 边沿非阻塞模式</span>
<span style="color: rgba(0, 128, 128, 1)">343</span>   ev.events = EPOLLIN |<span style="color: rgba(0, 0, 0, 1)"> EPOLLET;
</span><span style="color: rgba(0, 128, 128, 1)">344</span>   <span style="color: rgba(0, 0, 255, 1)">int</span> ret = epoll_ctl(epfd, EPOLL_CTL_ADD, cfd, &amp;<span style="color: rgba(0, 0, 0, 1)">ev);
</span><span style="color: rgba(0, 128, 128, 1)">345</span>   <span style="color: rgba(0, 0, 255, 1)">if</span>(ret == -<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">346</span> <span style="color: rgba(0, 0, 0, 1)">    {
</span><span style="color: rgba(0, 128, 128, 1)">347</span>         perror(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">epoll_ctl add cfd error</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">348</span>         exit(<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">349</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">350</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">351</span>
<span style="color: rgba(0, 128, 128, 1)">352</span> <span style="color: rgba(0, 0, 255, 1)">int</span> init_listen_fd(<span style="color: rgba(0, 0, 255, 1)">int</span> port, <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> epfd)
</span><span style="color: rgba(0, 128, 128, 1)">353</span> <span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(0, 128, 128, 1)">354</span>   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 创建监听的套接字</span>
<span style="color: rgba(0, 128, 128, 1)">355</span>   <span style="color: rgba(0, 0, 255, 1)">int</span> lfd = socket(AF_INET, SOCK_STREAM, <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">356</span>   <span style="color: rgba(0, 0, 255, 1)">if</span>(lfd == -<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">357</span> <span style="color: rgba(0, 0, 0, 1)">    {
</span><span style="color: rgba(0, 128, 128, 1)">358</span>         perror(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">socket error</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">359</span>         exit(<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">360</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">361</span>
<span style="color: rgba(0, 128, 128, 1)">362</span>   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> lfd绑定本地IP和port</span>
<span style="color: rgba(0, 128, 128, 1)">363</span>   <span style="color: rgba(0, 0, 255, 1)">struct</span><span style="color: rgba(0, 0, 0, 1)"> sockaddr_in serv;
</span><span style="color: rgba(0, 128, 128, 1)">364</span>   memset(&amp;serv, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(0, 0, 255, 1)">sizeof</span><span style="color: rgba(0, 0, 0, 1)">(serv));
</span><span style="color: rgba(0, 128, 128, 1)">365</span>   serv.sin_family =<span style="color: rgba(0, 0, 0, 1)"> AF_INET;
</span><span style="color: rgba(0, 128, 128, 1)">366</span>   serv.sin_port =<span style="color: rgba(0, 0, 0, 1)"> htons(port);
</span><span style="color: rgba(0, 128, 128, 1)">367</span>   serv.sin_addr.s_addr =<span style="color: rgba(0, 0, 0, 1)"> htonl(INADDR_ANY);
</span><span style="color: rgba(0, 128, 128, 1)">368</span>
<span style="color: rgba(0, 128, 128, 1)">369</span>   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 端口复用</span>
<span style="color: rgba(0, 128, 128, 1)">370</span>   <span style="color: rgba(0, 0, 255, 1)">int</span> flag = <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">371</span>   setsockopt(lfd, SOL_SOCKET, SO_REUSEADDR, &amp;flag, <span style="color: rgba(0, 0, 255, 1)">sizeof</span><span style="color: rgba(0, 0, 0, 1)">(flag));
</span><span style="color: rgba(0, 128, 128, 1)">372</span>   <span style="color: rgba(0, 0, 255, 1)">int</span> ret = bind(lfd, (<span style="color: rgba(0, 0, 255, 1)">struct</span> sockaddr*)&amp;serv, <span style="color: rgba(0, 0, 255, 1)">sizeof</span><span style="color: rgba(0, 0, 0, 1)">(serv));
</span><span style="color: rgba(0, 128, 128, 1)">373</span>   <span style="color: rgba(0, 0, 255, 1)">if</span>(ret == -<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">374</span> <span style="color: rgba(0, 0, 0, 1)">    {
</span><span style="color: rgba(0, 128, 128, 1)">375</span>         perror(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">bind error</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">376</span>         exit(<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">377</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">378</span>
<span style="color: rgba(0, 128, 128, 1)">379</span>   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 设置监听</span>
<span style="color: rgba(0, 128, 128, 1)">380</span>   ret = listen(lfd, <span style="color: rgba(128, 0, 128, 1)">64</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">381</span>   <span style="color: rgba(0, 0, 255, 1)">if</span>(ret == -<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">382</span> <span style="color: rgba(0, 0, 0, 1)">    {
</span><span style="color: rgba(0, 128, 128, 1)">383</span>         perror(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">listen error</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">384</span>         exit(<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">385</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">386</span>
<span style="color: rgba(0, 128, 128, 1)">387</span>   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> lfd添加到epoll树上</span>
<span style="color: rgba(0, 128, 128, 1)">388</span>   <span style="color: rgba(0, 0, 255, 1)">struct</span><span style="color: rgba(0, 0, 0, 1)"> epoll_event ev;
</span><span style="color: rgba(0, 128, 128, 1)">389</span>   ev.events =<span style="color: rgba(0, 0, 0, 1)"> EPOLLIN;
</span><span style="color: rgba(0, 128, 128, 1)">390</span>   ev.data.fd =<span style="color: rgba(0, 0, 0, 1)"> lfd;
</span><span style="color: rgba(0, 128, 128, 1)">391</span>   ret = epoll_ctl(epfd, EPOLL_CTL_ADD, lfd, &amp;<span style="color: rgba(0, 0, 0, 1)">ev);
</span><span style="color: rgba(0, 128, 128, 1)">392</span>   <span style="color: rgba(0, 0, 255, 1)">if</span>(ret == -<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">393</span> <span style="color: rgba(0, 0, 0, 1)">    {
</span><span style="color: rgba(0, 128, 128, 1)">394</span>         perror(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">epoll_ctl add lfd error</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">395</span>         exit(<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">396</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">397</span>
<span style="color: rgba(0, 128, 128, 1)">398</span>   <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> lfd;
</span><span style="color: rgba(0, 128, 128, 1)">399</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">400</span>
<span style="color: rgba(0, 128, 128, 1)">401</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 16进制数转化为10进制</span>
<span style="color: rgba(0, 128, 128, 1)">402</span> <span style="color: rgba(0, 0, 255, 1)">int</span> hexit(<span style="color: rgba(0, 0, 255, 1)">char</span><span style="color: rgba(0, 0, 0, 1)"> c)
</span><span style="color: rgba(0, 128, 128, 1)">403</span> <span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(0, 128, 128, 1)">404</span>   <span style="color: rgba(0, 0, 255, 1)">if</span> (c &gt;= <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">0</span><span style="color: rgba(128, 0, 0, 1)">'</span> &amp;&amp; c &lt;= <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">9</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">405</span>         <span style="color: rgba(0, 0, 255, 1)">return</span> c - <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">0</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">406</span>   <span style="color: rgba(0, 0, 255, 1)">if</span> (c &gt;= <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">a</span><span style="color: rgba(128, 0, 0, 1)">'</span> &amp;&amp; c &lt;= <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">f</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">407</span>         <span style="color: rgba(0, 0, 255, 1)">return</span> c - <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">a</span><span style="color: rgba(128, 0, 0, 1)">'</span> + <span style="color: rgba(128, 0, 128, 1)">10</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">408</span>   <span style="color: rgba(0, 0, 255, 1)">if</span> (c &gt;= <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">A</span><span style="color: rgba(128, 0, 0, 1)">'</span> &amp;&amp; c &lt;= <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">F</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">409</span>         <span style="color: rgba(0, 0, 255, 1)">return</span> c - <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">A</span><span style="color: rgba(128, 0, 0, 1)">'</span> + <span style="color: rgba(128, 0, 128, 1)">10</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">410</span>
<span style="color: rgba(0, 128, 128, 1)">411</span>   <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">412</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">413</span>
<span style="color: rgba(0, 128, 128, 1)">414</span> <span style="color: rgba(0, 128, 0, 1)">/*</span>
<span style="color: rgba(0, 128, 128, 1)">415</span> <span style="color: rgba(0, 128, 0, 1)"> *这里的内容是处理%20之类的东西!是"解码"过程。
</span><span style="color: rgba(0, 128, 128, 1)">416</span> <span style="color: rgba(0, 128, 0, 1)"> *%20 URL编码中的‘ ’(space)
</span><span style="color: rgba(0, 128, 128, 1)">417</span> <span style="color: rgba(0, 128, 0, 1)"> *%21 '!' %22 '"' %23 '#' %24 '$'
</span><span style="color: rgba(0, 128, 128, 1)">418</span> <span style="color: rgba(0, 128, 0, 1)"> *%25 '%' %26 '&amp;' %27 ''' %28 '('......
</span><span style="color: rgba(0, 128, 128, 1)">419</span> <span style="color: rgba(0, 128, 0, 1)"> *相关知识html中的‘ ’(space)是&amp;nbsp
</span><span style="color: rgba(0, 128, 128, 1)">420</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 128, 128, 1)">421</span> <span style="color: rgba(0, 0, 255, 1)">void</span> encode_str(<span style="color: rgba(0, 0, 255, 1)">char</span>* to, <span style="color: rgba(0, 0, 255, 1)">int</span> tosize, <span style="color: rgba(0, 0, 255, 1)">const</span> <span style="color: rgba(0, 0, 255, 1)">char</span>* <span style="color: rgba(0, 0, 255, 1)">from</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">422</span> <span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(0, 128, 128, 1)">423</span>   <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> tolen;
</span><span style="color: rgba(0, 128, 128, 1)">424</span>
<span style="color: rgba(0, 128, 128, 1)">425</span>   <span style="color: rgba(0, 0, 255, 1)">for</span> (tolen = <span style="color: rgba(128, 0, 128, 1)">0</span>; *<span style="color: rgba(0, 0, 255, 1)">from</span> != <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">\0</span><span style="color: rgba(128, 0, 0, 1)">'</span> &amp;&amp; tolen + <span style="color: rgba(128, 0, 128, 1)">4</span> &lt; tosize; ++<span style="color: rgba(0, 0, 255, 1)">from</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">426</span> <span style="color: rgba(0, 0, 0, 1)">    {
</span><span style="color: rgba(0, 128, 128, 1)">427</span>         <span style="color: rgba(0, 0, 255, 1)">if</span> (isalnum(*<span style="color: rgba(0, 0, 255, 1)">from</span>) || strchr(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/_.-~</span><span style="color: rgba(128, 0, 0, 1)">"</span>, *<span style="color: rgba(0, 0, 255, 1)">from</span>) != (<span style="color: rgba(0, 0, 255, 1)">char</span>*)<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">428</span> <span style="color: rgba(0, 0, 0, 1)">      {
</span><span style="color: rgba(0, 128, 128, 1)">429</span>             *to = *<span style="color: rgba(0, 0, 255, 1)">from</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">430</span>             ++<span style="color: rgba(0, 0, 0, 1)">to;
</span><span style="color: rgba(0, 128, 128, 1)">431</span>             ++<span style="color: rgba(0, 0, 0, 1)">tolen;
</span><span style="color: rgba(0, 128, 128, 1)">432</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)">433</span>         <span style="color: rgba(0, 0, 255, 1)">else</span>
<span style="color: rgba(0, 128, 128, 1)">434</span> <span style="color: rgba(0, 0, 0, 1)">      {
</span><span style="color: rgba(0, 128, 128, 1)">435</span>             sprintf(to, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">%%%02x</span><span style="color: rgba(128, 0, 0, 1)">"</span>, (<span style="color: rgba(0, 0, 255, 1)">int</span>) *<span style="color: rgba(0, 0, 255, 1)">from</span> &amp; <span style="color: rgba(128, 0, 128, 1)">0xff</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">436</span>             to += <span style="color: rgba(128, 0, 128, 1)">3</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">437</span>             tolen += <span style="color: rgba(128, 0, 128, 1)">3</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">438</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)">439</span>
<span style="color: rgba(0, 128, 128, 1)">440</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">441</span>   *to = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">\0</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">442</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">443</span>
<span style="color: rgba(0, 128, 128, 1)">444</span>
<span style="color: rgba(0, 128, 128, 1)">445</span> <span style="color: rgba(0, 0, 255, 1)">void</span> decode_str(<span style="color: rgba(0, 0, 255, 1)">char</span> *to, <span style="color: rgba(0, 0, 255, 1)">char</span> *<span style="color: rgba(0, 0, 255, 1)">from</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">446</span> <span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(0, 128, 128, 1)">447</span>   <span style="color: rgba(0, 0, 255, 1)">for</span> ( ; *<span style="color: rgba(0, 0, 255, 1)">from</span> != <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">\0</span><span style="color: rgba(128, 0, 0, 1)">'</span>; ++to, ++<span style="color: rgba(0, 0, 255, 1)">from</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">448</span> <span style="color: rgba(0, 0, 0, 1)">    {
</span><span style="color: rgba(0, 128, 128, 1)">449</span>         <span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">from</span>[<span style="color: rgba(128, 0, 128, 1)">0</span>] == <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">%</span><span style="color: rgba(128, 0, 0, 1)">'</span> &amp;&amp; isxdigit(<span style="color: rgba(0, 0, 255, 1)">from</span>[<span style="color: rgba(128, 0, 128, 1)">1</span>]) &amp;&amp; isxdigit(<span style="color: rgba(0, 0, 255, 1)">from</span>[<span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">]))
</span><span style="color: rgba(0, 128, 128, 1)">450</span> <span style="color: rgba(0, 0, 0, 1)">      {
</span><span style="color: rgba(0, 128, 128, 1)">451</span>
<span style="color: rgba(0, 128, 128, 1)">452</span>             *to = hexit(<span style="color: rgba(0, 0, 255, 1)">from</span>[<span style="color: rgba(128, 0, 128, 1)">1</span>])*<span style="color: rgba(128, 0, 128, 1)">16</span> + hexit(<span style="color: rgba(0, 0, 255, 1)">from</span>[<span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">]);
</span><span style="color: rgba(0, 128, 128, 1)">453</span>
<span style="color: rgba(0, 128, 128, 1)">454</span>             <span style="color: rgba(0, 0, 255, 1)">from</span> += <span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">;                     
</span><span style="color: rgba(0, 128, 128, 1)">455</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)">456</span>         <span style="color: rgba(0, 0, 255, 1)">else</span>
<span style="color: rgba(0, 128, 128, 1)">457</span> <span style="color: rgba(0, 0, 0, 1)">      {
</span><span style="color: rgba(0, 128, 128, 1)">458</span>             *to = *<span style="color: rgba(0, 0, 255, 1)">from</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">459</span>
<span style="color: rgba(0, 128, 128, 1)">460</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)">461</span>
<span style="color: rgba(0, 128, 128, 1)">462</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">463</span>   *to = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">\0</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">464</span>
<span style="color: rgba(0, 128, 128, 1)">465</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">466</span>
<span style="color: rgba(0, 128, 128, 1)">467</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 通过文件名获取文件的类型</span>
<span style="color: rgba(0, 128, 128, 1)">468</span> <span style="color: rgba(0, 0, 255, 1)">const</span> <span style="color: rgba(0, 0, 255, 1)">char</span> *get_file_type(<span style="color: rgba(0, 0, 255, 1)">const</span> <span style="color: rgba(0, 0, 255, 1)">char</span> *<span style="color: rgba(0, 0, 0, 1)">name)
</span><span style="color: rgba(0, 128, 128, 1)">469</span> <span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(0, 128, 128, 1)">470</span>   <span style="color: rgba(0, 0, 255, 1)">char</span>*<span style="color: rgba(0, 0, 0, 1)"> dot;
</span><span style="color: rgba(0, 128, 128, 1)">471</span>
<span style="color: rgba(0, 128, 128, 1)">472</span>   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 自右向左查找‘.’字符, 如不存在返回NULL</span>
<span style="color: rgba(0, 128, 128, 1)">473</span>   dot = strrchr(name, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">.</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);   
</span><span style="color: rgba(0, 128, 128, 1)">474</span>   <span style="color: rgba(0, 0, 255, 1)">if</span> (dot ==<span style="color: rgba(0, 0, 0, 1)"> NULL)
</span><span style="color: rgba(0, 128, 128, 1)">475</span>         <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">text/plain; charset=utf-8</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">476</span>   <span style="color: rgba(0, 0, 255, 1)">if</span> (strcmp(dot, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">.html</span><span style="color: rgba(128, 0, 0, 1)">"</span>) == <span style="color: rgba(128, 0, 128, 1)">0</span> || strcmp(dot, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">.htm</span><span style="color: rgba(128, 0, 0, 1)">"</span>) == <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">477</span>         <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">text/html; charset=utf-8</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">478</span>   <span style="color: rgba(0, 0, 255, 1)">if</span> (strcmp(dot, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">.jpg</span><span style="color: rgba(128, 0, 0, 1)">"</span>) == <span style="color: rgba(128, 0, 128, 1)">0</span> || strcmp(dot, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">.jpeg</span><span style="color: rgba(128, 0, 0, 1)">"</span>) == <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">479</span>         <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">image/jpeg</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">480</span>   <span style="color: rgba(0, 0, 255, 1)">if</span> (strcmp(dot, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">.gif</span><span style="color: rgba(128, 0, 0, 1)">"</span>) == <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">481</span>         <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">image/gif</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">482</span>   <span style="color: rgba(0, 0, 255, 1)">if</span> (strcmp(dot, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">.png</span><span style="color: rgba(128, 0, 0, 1)">"</span>) == <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">483</span>         <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">image/png</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">484</span>   <span style="color: rgba(0, 0, 255, 1)">if</span> (strcmp(dot, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">.css</span><span style="color: rgba(128, 0, 0, 1)">"</span>) == <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">485</span>         <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">text/css</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">486</span>   <span style="color: rgba(0, 0, 255, 1)">if</span> (strcmp(dot, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">.au</span><span style="color: rgba(128, 0, 0, 1)">"</span>) == <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">487</span>         <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">audio/basic</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">488</span>   <span style="color: rgba(0, 0, 255, 1)">if</span> (strcmp( dot, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">.wav</span><span style="color: rgba(128, 0, 0, 1)">"</span> ) == <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">489</span>         <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">audio/wav</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">490</span>   <span style="color: rgba(0, 0, 255, 1)">if</span> (strcmp(dot, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">.avi</span><span style="color: rgba(128, 0, 0, 1)">"</span>) == <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">491</span>         <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">video/x-msvideo</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">492</span>   <span style="color: rgba(0, 0, 255, 1)">if</span> (strcmp(dot, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">.mov</span><span style="color: rgba(128, 0, 0, 1)">"</span>) == <span style="color: rgba(128, 0, 128, 1)">0</span> || strcmp(dot, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">.qt</span><span style="color: rgba(128, 0, 0, 1)">"</span>) == <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">493</span>         <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">video/quicktime</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">494</span>   <span style="color: rgba(0, 0, 255, 1)">if</span> (strcmp(dot, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">.mpeg</span><span style="color: rgba(128, 0, 0, 1)">"</span>) == <span style="color: rgba(128, 0, 128, 1)">0</span> || strcmp(dot, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">.mpe</span><span style="color: rgba(128, 0, 0, 1)">"</span>) == <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">495</span>         <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">video/mpeg</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">496</span>   <span style="color: rgba(0, 0, 255, 1)">if</span> (strcmp(dot, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">.vrml</span><span style="color: rgba(128, 0, 0, 1)">"</span>) == <span style="color: rgba(128, 0, 128, 1)">0</span> || strcmp(dot, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">.wrl</span><span style="color: rgba(128, 0, 0, 1)">"</span>) == <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">497</span>         <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">model/vrml</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">498</span>   <span style="color: rgba(0, 0, 255, 1)">if</span> (strcmp(dot, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">.midi</span><span style="color: rgba(128, 0, 0, 1)">"</span>) == <span style="color: rgba(128, 0, 128, 1)">0</span> || strcmp(dot, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">.mid</span><span style="color: rgba(128, 0, 0, 1)">"</span>) == <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">499</span>         <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">audio/midi</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">500</span>   <span style="color: rgba(0, 0, 255, 1)">if</span> (strcmp(dot, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">.mp3</span><span style="color: rgba(128, 0, 0, 1)">"</span>) == <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">501</span>         <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">audio/mpeg</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">502</span>   <span style="color: rgba(0, 0, 255, 1)">if</span> (strcmp(dot, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">.ogg</span><span style="color: rgba(128, 0, 0, 1)">"</span>) == <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">503</span>         <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">application/ogg</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">504</span>   <span style="color: rgba(0, 0, 255, 1)">if</span> (strcmp(dot, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">.pac</span><span style="color: rgba(128, 0, 0, 1)">"</span>) == <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">505</span>         <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">application/x-ns-proxy-autoconfig</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">506</span>
<span style="color: rgba(0, 128, 128, 1)">507</span>   <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">text/plain; charset=utf-8</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">508</span> }</pre>
</div>
<span class="cnblogs_code_collapse">epoll_server.c</span></div>
<div class="cnblogs_code"><img id="code_img_closed_6d43e357-f74d-4beb-8ff8-143ffa646a6a" class="code_img_closed lazyload" alt="" data-src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif"><img id="code_img_opened_6d43e357-f74d-4beb-8ff8-143ffa646a6a" class="code_img_opened lazyload" style="display: none" alt="" data-src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif">
<div id="cnblogs_code_open_6d43e357-f74d-4beb-8ff8-143ffa646a6a" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 0, 1)">#ifndef _EPOLL_SERVER_H
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span> <span style="color: rgba(0, 0, 255, 1)">#define</span> _EPOLL_SERVER_H
<span style="color: rgba(0, 128, 128, 1)"> 3</span>
<span style="color: rgba(0, 128, 128, 1)"> 4</span> <span style="color: rgba(0, 0, 255, 1)">int</span> init_listen_fd(<span style="color: rgba(0, 0, 255, 1)">int</span> port, <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> epfd);
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span> <span style="color: rgba(0, 0, 255, 1)">void</span> epoll_run(<span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> port);
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span> <span style="color: rgba(0, 0, 255, 1)">void</span> do_accept(<span style="color: rgba(0, 0, 255, 1)">int</span> lfd, <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> epfd);
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span> <span style="color: rgba(0, 0, 255, 1)">void</span> do_read(<span style="color: rgba(0, 0, 255, 1)">int</span> cfd, <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> epfd);
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span> <span style="color: rgba(0, 0, 255, 1)">int</span> get_line(<span style="color: rgba(0, 0, 255, 1)">int</span> sock, <span style="color: rgba(0, 0, 255, 1)">char</span> *buf, <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> size);
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span> <span style="color: rgba(0, 0, 255, 1)">void</span> disconnect(<span style="color: rgba(0, 0, 255, 1)">int</span> cfd, <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> epfd);
</span><span style="color: rgba(0, 128, 128, 1)">10</span> <span style="color: rgba(0, 0, 255, 1)">void</span> http_request(<span style="color: rgba(0, 0, 255, 1)">const</span> <span style="color: rgba(0, 0, 255, 1)">char</span>* request, <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> cfd);
</span><span style="color: rgba(0, 128, 128, 1)">11</span> <span style="color: rgba(0, 0, 255, 1)">void</span> send_respond_head(<span style="color: rgba(0, 0, 255, 1)">int</span> cfd, <span style="color: rgba(0, 0, 255, 1)">int</span> no, <span style="color: rgba(0, 0, 255, 1)">const</span> <span style="color: rgba(0, 0, 255, 1)">char</span>* desp, <span style="color: rgba(0, 0, 255, 1)">const</span> <span style="color: rgba(0, 0, 255, 1)">char</span>* type, <span style="color: rgba(0, 0, 255, 1)">long</span><span style="color: rgba(0, 0, 0, 1)"> len);
</span><span style="color: rgba(0, 128, 128, 1)">12</span> <span style="color: rgba(0, 0, 255, 1)">void</span> send_file(<span style="color: rgba(0, 0, 255, 1)">int</span> cfd, <span style="color: rgba(0, 0, 255, 1)">const</span> <span style="color: rgba(0, 0, 255, 1)">char</span>*<span style="color: rgba(0, 0, 0, 1)"> filename);
</span><span style="color: rgba(0, 128, 128, 1)">13</span> <span style="color: rgba(0, 0, 255, 1)">void</span> send_dir(<span style="color: rgba(0, 0, 255, 1)">int</span> cfd, <span style="color: rgba(0, 0, 255, 1)">const</span> <span style="color: rgba(0, 0, 255, 1)">char</span>*<span style="color: rgba(0, 0, 0, 1)"> dirname);
</span><span style="color: rgba(0, 128, 128, 1)">14</span> <span style="color: rgba(0, 0, 255, 1)">void</span> encode_str(<span style="color: rgba(0, 0, 255, 1)">char</span>* to, <span style="color: rgba(0, 0, 255, 1)">int</span> tosize, <span style="color: rgba(0, 0, 255, 1)">const</span> <span style="color: rgba(0, 0, 255, 1)">char</span>* <span style="color: rgba(0, 0, 255, 1)">from</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">15</span> <span style="color: rgba(0, 0, 255, 1)">void</span> decode_str(<span style="color: rgba(0, 0, 255, 1)">char</span> *to, <span style="color: rgba(0, 0, 255, 1)">char</span> *<span style="color: rgba(0, 0, 255, 1)">from</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">16</span> <span style="color: rgba(0, 0, 255, 1)">const</span> <span style="color: rgba(0, 0, 255, 1)">char</span> *get_file_type(<span style="color: rgba(0, 0, 255, 1)">const</span> <span style="color: rgba(0, 0, 255, 1)">char</span> *<span style="color: rgba(0, 0, 0, 1)">name);
</span><span style="color: rgba(0, 128, 128, 1)">17</span>
<span style="color: rgba(0, 128, 128, 1)">18</span> <span style="color: rgba(0, 0, 255, 1)">#endif</span></pre>
</div>
<span class="cnblogs_code_collapse">epoll_server.h</span></div>
<div class="cnblogs_code"><img id="code_img_closed_d951b352-42d6-47b5-8adf-8edd03ed114b" class="code_img_closed lazyload" alt="" data-src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif"><img id="code_img_opened_d951b352-42d6-47b5-8adf-8edd03ed114b" class="code_img_opened lazyload" style="display: none" alt="" data-src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif">
<div id="cnblogs_code_open_d951b352-42d6-47b5-8adf-8edd03ed114b" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> #include &lt;stdio.h&gt;
<span style="color: rgba(0, 128, 128, 1)"> 2</span> #include &lt;unistd.h&gt;
<span style="color: rgba(0, 128, 128, 1)"> 3</span> #include &lt;stdlib.h&gt;
<span style="color: rgba(0, 128, 128, 1)"> 4</span> #include <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">epoll_server.h</span><span style="color: rgba(128, 0, 0, 1)">"</span>
<span style="color: rgba(0, 128, 128, 1)"> 5</span>
<span style="color: rgba(0, 128, 128, 1)"> 6</span> <span style="color: rgba(0, 0, 255, 1)">int</span> main(<span style="color: rgba(0, 0, 255, 1)">int</span> argc, <span style="color: rgba(0, 0, 255, 1)">const</span> <span style="color: rgba(0, 0, 255, 1)">char</span>*<span style="color: rgba(0, 0, 0, 1)"> argv[])
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span> <span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span>   <span style="color: rgba(0, 0, 255, 1)">if</span>(argc &lt; <span style="color: rgba(128, 0, 128, 1)">3</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span> <span style="color: rgba(0, 0, 0, 1)">    {
</span><span style="color: rgba(0, 128, 128, 1)">10</span>         printf(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">eg: ./a.out port path\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">11</span>         exit(<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">12</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">13</span>
<span style="color: rgba(0, 128, 128, 1)">14</span>   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 端口</span>
<span style="color: rgba(0, 128, 128, 1)">15</span>   <span style="color: rgba(0, 0, 255, 1)">int</span> port = atoi(argv[<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">]);
</span><span style="color: rgba(0, 128, 128, 1)">16</span>   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 修改进程的工作目录, 方便后续操作</span>
<span style="color: rgba(0, 128, 128, 1)">17</span>   <span style="color: rgba(0, 0, 255, 1)">int</span> ret = chdir(argv[<span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">]);
</span><span style="color: rgba(0, 128, 128, 1)">18</span>   <span style="color: rgba(0, 0, 255, 1)">if</span>(ret == -<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">19</span> <span style="color: rgba(0, 0, 0, 1)">    {
</span><span style="color: rgba(0, 128, 128, 1)">20</span>         perror(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">chdir error</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">21</span>         exit(<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">22</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">23</span>   
<span style="color: rgba(0, 128, 128, 1)">24</span>   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 启动epoll模型 </span>
<span style="color: rgba(0, 128, 128, 1)">25</span> <span style="color: rgba(0, 0, 0, 1)">    epoll_run(port);
</span><span style="color: rgba(0, 128, 128, 1)">26</span>
<span style="color: rgba(0, 128, 128, 1)">27</span>   <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">28</span> }</pre>
</div>
<span class="cnblogs_code_collapse">main.c</span></div>
<p><span style="color: rgba(255, 0, 0, 1)">&nbsp; &nbsp; 版本2(使用libevent实现):</span></p>
<div class="cnblogs_code"><img id="code_img_closed_8fce1ccd-3da9-4788-9ba2-b30072fad239" class="code_img_closed lazyload" alt="" data-src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif"><img id="code_img_opened_8fce1ccd-3da9-4788-9ba2-b30072fad239" class="code_img_opened lazyload" style="display: none" alt="" data-src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif">
<div id="cnblogs_code_open_8fce1ccd-3da9-4788-9ba2-b30072fad239" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> #include &lt;stdio.h&gt;
<span style="color: rgba(0, 128, 128, 1)">2</span> #include &lt;unistd.h&gt;
<span style="color: rgba(0, 128, 128, 1)">3</span> #include &lt;stdlib.h&gt;
<span style="color: rgba(0, 128, 128, 1)">4</span> #include &lt;fcntl.h&gt;
<span style="color: rgba(0, 128, 128, 1)">5</span> #include &lt;sys/types.h&gt;
<span style="color: rgba(0, 128, 128, 1)">6</span> #include &lt;sys/socket.h&gt;
<span style="color: rgba(0, 128, 128, 1)">7</span> #include &lt;arpa/inet.h&gt;
<span style="color: rgba(0, 128, 128, 1)">8</span> #include &lt;sys/stat.h&gt;
<span style="color: rgba(0, 128, 128, 1)">9</span> #include &lt;<span style="color: rgba(0, 0, 255, 1)">string</span>.h&gt;
<span style="color: rgba(0, 128, 128, 1)"> 10</span> #include &lt;dirent.h&gt;
<span style="color: rgba(0, 128, 128, 1)"> 11</span> #include &lt;time.h&gt;
<span style="color: rgba(0, 128, 128, 1)"> 12</span> #include &lt;signal.h&gt;
<span style="color: rgba(0, 128, 128, 1)"> 13</span> #include &lt;ctype.h&gt;
<span style="color: rgba(0, 128, 128, 1)"> 14</span> #include &lt;errno.h&gt;
<span style="color: rgba(0, 128, 128, 1)"> 15</span> #include &lt;event2/bufferevent.h&gt;
<span style="color: rgba(0, 128, 128, 1)"> 16</span> #include &lt;event2/buffer.h&gt;
<span style="color: rgba(0, 128, 128, 1)"> 17</span> #include &lt;event2/listener.h&gt;
<span style="color: rgba(0, 128, 128, 1)"> 18</span> #include <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">libevent_http.h</span><span style="color: rgba(128, 0, 0, 1)">"</span>
<span style="color: rgba(0, 128, 128, 1)"> 19</span>
<span style="color: rgba(0, 128, 128, 1)"> 20</span> <span style="color: rgba(0, 0, 255, 1)">#define</span> _HTTP_CLOSE_ "Connection: close\r\n"
<span style="color: rgba(0, 128, 128, 1)"> 21</span>
<span style="color: rgba(0, 128, 128, 1)"> 22</span> <span style="color: rgba(0, 0, 255, 1)">int</span> response_http(<span style="color: rgba(0, 0, 255, 1)">struct</span> bufferevent *bev, <span style="color: rgba(0, 0, 255, 1)">const</span> <span style="color: rgba(0, 0, 255, 1)">char</span> *method, <span style="color: rgba(0, 0, 255, 1)">char</span> *<span style="color: rgba(0, 0, 0, 1)">path)
</span><span style="color: rgba(0, 128, 128, 1)"> 23</span> <span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(0, 128, 128, 1)"> 24</span>   <span style="color: rgba(0, 0, 255, 1)">if</span>(strcasecmp(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">GET</span><span style="color: rgba(128, 0, 0, 1)">"</span>, method) == <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(0, 128, 128, 1)"> 25</span>         <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">get method ...</span>
<span style="color: rgba(0, 128, 128, 1)"> 26</span> <span style="color: rgba(0, 0, 0, 1)">      strdecode(path, path);
</span><span style="color: rgba(0, 128, 128, 1)"> 27</span>         <span style="color: rgba(0, 0, 255, 1)">char</span> *pf = &amp;path[<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">];
</span><span style="color: rgba(0, 128, 128, 1)"> 28</span>
<span style="color: rgba(0, 128, 128, 1)"> 29</span>         <span style="color: rgba(0, 0, 255, 1)">if</span>(strcmp(path, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/</span><span style="color: rgba(128, 0, 0, 1)">"</span>) == <span style="color: rgba(128, 0, 128, 1)">0</span> || strcmp(path, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/.</span><span style="color: rgba(128, 0, 0, 1)">"</span>) == <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 30</span> <span style="color: rgba(0, 0, 0, 1)">      {
</span><span style="color: rgba(0, 128, 128, 1)"> 31</span>             pf=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">./</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 32</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)"> 33</span>
<span style="color: rgba(0, 128, 128, 1)"> 34</span>         printf(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">***** http Request Resource Path =%s, pf = %s\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, path, pf);
</span><span style="color: rgba(0, 128, 128, 1)"> 35</span>
<span style="color: rgba(0, 128, 128, 1)"> 36</span>         <span style="color: rgba(0, 0, 255, 1)">struct</span><span style="color: rgba(0, 0, 0, 1)"> stat sb;
</span><span style="color: rgba(0, 128, 128, 1)"> 37</span>         <span style="color: rgba(0, 0, 255, 1)">if</span>(stat(pf,&amp;sb) &lt; <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 38</span> <span style="color: rgba(0, 0, 0, 1)">      {
</span><span style="color: rgba(0, 128, 128, 1)"> 39</span>             perror(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">open file err:</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 40</span> <span style="color: rgba(0, 0, 0, 1)">            send_error(bev);
</span><span style="color: rgba(0, 128, 128, 1)"> 41</span>             <span style="color: rgba(0, 0, 255, 1)">return</span> -<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 42</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)"> 43</span>
<span style="color: rgba(0, 128, 128, 1)"> 44</span>         <span style="color: rgba(0, 0, 255, 1)">if</span>(S_ISDIR(sb.st_mode))<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">处理目录</span>
<span style="color: rgba(0, 128, 128, 1)"> 45</span> <span style="color: rgba(0, 0, 0, 1)">      {
</span><span style="color: rgba(0, 128, 128, 1)"> 46</span>             <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">应该显示目录列表</span>
<span style="color: rgba(0, 128, 128, 1)"> 47</span>             send_header(bev, <span style="color: rgba(128, 0, 128, 1)">200</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">OK</span><span style="color: rgba(128, 0, 0, 1)">"</span>, get_file_type(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">.html</span><span style="color: rgba(128, 0, 0, 1)">"</span>), -<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 48</span> <span style="color: rgba(0, 0, 0, 1)">            send_dir(bev, pf);
</span><span style="color: rgba(0, 128, 128, 1)"> 49</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)"> 50</span>         <span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">处理文件</span>
<span style="color: rgba(0, 128, 128, 1)"> 51</span> <span style="color: rgba(0, 0, 0, 1)">      {
</span><span style="color: rgba(0, 128, 128, 1)"> 52</span>             send_header(bev, <span style="color: rgba(128, 0, 128, 1)">200</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">OK</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, get_file_type(pf), sb.st_size);
</span><span style="color: rgba(0, 128, 128, 1)"> 53</span> <span style="color: rgba(0, 0, 0, 1)">            send_file_to_http(pf, bev);
</span><span style="color: rgba(0, 128, 128, 1)"> 54</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)"> 55</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)"> 56</span>
<span style="color: rgba(0, 128, 128, 1)"> 57</span>   <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 58</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)"> 59</span>
<span style="color: rgba(0, 128, 128, 1)"> 60</span> <span style="color: rgba(0, 128, 0, 1)">/*</span>
<span style="color: rgba(0, 128, 128, 1)"> 61</span> <span style="color: rgba(0, 128, 0, 1)">   *charset=iso-8859-1    西欧的编码,说明网站采用的编码是英文;
</span><span style="color: rgba(0, 128, 128, 1)"> 62</span> <span style="color: rgba(0, 128, 0, 1)">   *charset=gb2312      说明网站采用的编码是简体中文;
</span><span style="color: rgba(0, 128, 128, 1)"> 63</span> <span style="color: rgba(0, 128, 0, 1)">   *charset=utf-8            代表世界通用的语言编码;
</span><span style="color: rgba(0, 128, 128, 1)"> 64</span> <span style="color: rgba(0, 128, 0, 1)">   *                        可以用到中文、韩文、日文等世界上所有语言编码上
</span><span style="color: rgba(0, 128, 128, 1)"> 65</span> <span style="color: rgba(0, 128, 0, 1)">   *charset=euc-kr      说明网站采用的编码是韩文;
</span><span style="color: rgba(0, 128, 128, 1)"> 66</span> <span style="color: rgba(0, 128, 0, 1)">   *charset=big5            说明网站采用的编码是繁体中文;
</span><span style="color: rgba(0, 128, 128, 1)"> 67</span> <span style="color: rgba(0, 128, 0, 1)">   *
</span><span style="color: rgba(0, 128, 128, 1)"> 68</span> <span style="color: rgba(0, 128, 0, 1)">   *以下是依据传递进来的文件名,使用后缀判断是何种文件类型
</span><span style="color: rgba(0, 128, 128, 1)"> 69</span> <span style="color: rgba(0, 128, 0, 1)">   *将对应的文件类型按照http定义的关键字发送回去
</span><span style="color: rgba(0, 128, 128, 1)"> 70</span> <span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 128, 128, 1)"> 71</span> <span style="color: rgba(0, 0, 255, 1)">const</span> <span style="color: rgba(0, 0, 255, 1)">char</span> *get_file_type(<span style="color: rgba(0, 0, 255, 1)">char</span> *<span style="color: rgba(0, 0, 0, 1)">name)
</span><span style="color: rgba(0, 128, 128, 1)"> 72</span> <span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(0, 128, 128, 1)"> 73</span>   <span style="color: rgba(0, 0, 255, 1)">char</span>*<span style="color: rgba(0, 0, 0, 1)"> dot;
</span><span style="color: rgba(0, 128, 128, 1)"> 74</span>
<span style="color: rgba(0, 128, 128, 1)"> 75</span>   dot = strrchr(name, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">.</span><span style="color: rgba(128, 0, 0, 1)">'</span>);    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">自右向左查找‘.’字符;如不存在返回NULL</span>
<span style="color: rgba(0, 128, 128, 1)"> 76</span>
<span style="color: rgba(0, 128, 128, 1)"> 77</span>   <span style="color: rgba(0, 0, 255, 1)">if</span> (dot == (<span style="color: rgba(0, 0, 255, 1)">char</span>*)<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 78</span>         <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">text/plain; charset=utf-8</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 79</span>   <span style="color: rgba(0, 0, 255, 1)">if</span> (strcmp(dot, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">.html</span><span style="color: rgba(128, 0, 0, 1)">"</span>) == <span style="color: rgba(128, 0, 128, 1)">0</span> || strcmp(dot, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">.htm</span><span style="color: rgba(128, 0, 0, 1)">"</span>) == <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 80</span>         <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">text/html; charset=utf-8</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 81</span>   <span style="color: rgba(0, 0, 255, 1)">if</span> (strcmp(dot, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">.jpg</span><span style="color: rgba(128, 0, 0, 1)">"</span>) == <span style="color: rgba(128, 0, 128, 1)">0</span> || strcmp(dot, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">.jpeg</span><span style="color: rgba(128, 0, 0, 1)">"</span>) == <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 82</span>         <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">image/jpeg</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 83</span>   <span style="color: rgba(0, 0, 255, 1)">if</span> (strcmp(dot, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">.gif</span><span style="color: rgba(128, 0, 0, 1)">"</span>) == <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 84</span>         <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">image/gif</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 85</span>   <span style="color: rgba(0, 0, 255, 1)">if</span> (strcmp(dot, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">.png</span><span style="color: rgba(128, 0, 0, 1)">"</span>) == <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 86</span>         <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">image/png</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 87</span>   <span style="color: rgba(0, 0, 255, 1)">if</span> (strcmp(dot, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">.css</span><span style="color: rgba(128, 0, 0, 1)">"</span>) == <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 88</span>         <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">text/css</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 89</span>   <span style="color: rgba(0, 0, 255, 1)">if</span> (strcmp(dot, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">.au</span><span style="color: rgba(128, 0, 0, 1)">"</span>) == <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 90</span>         <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">audio/basic</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 91</span>   <span style="color: rgba(0, 0, 255, 1)">if</span> (strcmp( dot, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">.wav</span><span style="color: rgba(128, 0, 0, 1)">"</span>) == <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 92</span>         <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">audio/wav</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 93</span>   <span style="color: rgba(0, 0, 255, 1)">if</span> (strcmp(dot, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">.avi</span><span style="color: rgba(128, 0, 0, 1)">"</span>) == <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 94</span>         <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">video/x-msvideo</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 95</span>   <span style="color: rgba(0, 0, 255, 1)">if</span> (strcmp(dot, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">.mov</span><span style="color: rgba(128, 0, 0, 1)">"</span>) == <span style="color: rgba(128, 0, 128, 1)">0</span> || strcmp(dot, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">.qt</span><span style="color: rgba(128, 0, 0, 1)">"</span>) == <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 96</span>         <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">video/quicktime</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 97</span>   <span style="color: rgba(0, 0, 255, 1)">if</span> (strcmp(dot, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">.mpeg</span><span style="color: rgba(128, 0, 0, 1)">"</span>) == <span style="color: rgba(128, 0, 128, 1)">0</span> || strcmp(dot, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">.mpe</span><span style="color: rgba(128, 0, 0, 1)">"</span>) == <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 98</span>         <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">video/mpeg</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 99</span>   <span style="color: rgba(0, 0, 255, 1)">if</span> (strcmp(dot, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">.vrml</span><span style="color: rgba(128, 0, 0, 1)">"</span>) == <span style="color: rgba(128, 0, 128, 1)">0</span> || strcmp(dot, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">.wrl</span><span style="color: rgba(128, 0, 0, 1)">"</span>) == <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">100</span>         <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">model/vrml</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">101</span>   <span style="color: rgba(0, 0, 255, 1)">if</span> (strcmp(dot, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">.midi</span><span style="color: rgba(128, 0, 0, 1)">"</span>) == <span style="color: rgba(128, 0, 128, 1)">0</span> || strcmp(dot, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">.mid</span><span style="color: rgba(128, 0, 0, 1)">"</span>) == <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">102</span>         <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">audio/midi</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">103</span>   <span style="color: rgba(0, 0, 255, 1)">if</span> (strcmp(dot, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">.mp3</span><span style="color: rgba(128, 0, 0, 1)">"</span>) == <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">104</span>         <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">audio/mpeg</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">105</span>   <span style="color: rgba(0, 0, 255, 1)">if</span> (strcmp(dot, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">.ogg</span><span style="color: rgba(128, 0, 0, 1)">"</span>) == <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">106</span>         <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">application/ogg</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">107</span>   <span style="color: rgba(0, 0, 255, 1)">if</span> (strcmp(dot, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">.pac</span><span style="color: rgba(128, 0, 0, 1)">"</span>) == <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">108</span>         <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">application/x-ns-proxy-autoconfig</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">109</span>
<span style="color: rgba(0, 128, 128, 1)">110</span>   <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">text/plain; charset=utf-8</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">111</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">112</span>
<span style="color: rgba(0, 128, 128, 1)">113</span> <span style="color: rgba(0, 0, 255, 1)">int</span> send_file_to_http(<span style="color: rgba(0, 0, 255, 1)">const</span> <span style="color: rgba(0, 0, 255, 1)">char</span> *filename, <span style="color: rgba(0, 0, 255, 1)">struct</span> bufferevent *<span style="color: rgba(0, 0, 0, 1)">bev)
</span><span style="color: rgba(0, 128, 128, 1)">114</span> <span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(0, 128, 128, 1)">115</span>   <span style="color: rgba(0, 0, 255, 1)">int</span> fd =<span style="color: rgba(0, 0, 0, 1)"> open(filename, O_RDONLY);
</span><span style="color: rgba(0, 128, 128, 1)">116</span>   <span style="color: rgba(0, 0, 255, 1)">int</span> ret = <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">117</span>   <span style="color: rgba(0, 0, 255, 1)">char</span> buf[<span style="color: rgba(128, 0, 128, 1)">4096</span>] = {<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">};
</span><span style="color: rgba(0, 128, 128, 1)">118</span>
<span style="color: rgba(0, 128, 128, 1)">119</span>   <span style="color: rgba(0, 0, 255, 1)">while</span>((ret = read(fd, buf, <span style="color: rgba(0, 0, 255, 1)">sizeof</span><span style="color: rgba(0, 0, 0, 1)">(buf)) ) )
</span><span style="color: rgba(0, 128, 128, 1)">120</span> <span style="color: rgba(0, 0, 0, 1)">    {
</span><span style="color: rgba(0, 128, 128, 1)">121</span> <span style="color: rgba(0, 0, 0, 1)">      bufferevent_write(bev, buf, ret);
</span><span style="color: rgba(0, 128, 128, 1)">122</span>         memset(buf, <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">, ret);
</span><span style="color: rgba(0, 128, 128, 1)">123</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">124</span> <span style="color: rgba(0, 0, 0, 1)">    close(fd);
</span><span style="color: rgba(0, 128, 128, 1)">125</span>   <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">126</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">127</span>
<span style="color: rgba(0, 128, 128, 1)">128</span> <span style="color: rgba(0, 0, 255, 1)">int</span> send_header(<span style="color: rgba(0, 0, 255, 1)">struct</span> bufferevent *bev, <span style="color: rgba(0, 0, 255, 1)">int</span> no, <span style="color: rgba(0, 0, 255, 1)">const</span> <span style="color: rgba(0, 0, 255, 1)">char</span>* desp, <span style="color: rgba(0, 0, 255, 1)">const</span> <span style="color: rgba(0, 0, 255, 1)">char</span> *type, <span style="color: rgba(0, 0, 255, 1)">long</span><span style="color: rgba(0, 0, 0, 1)"> len)
</span><span style="color: rgba(0, 128, 128, 1)">129</span> <span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(0, 128, 128, 1)">130</span>   <span style="color: rgba(0, 0, 255, 1)">char</span> buf[<span style="color: rgba(128, 0, 128, 1)">256</span>]={<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">};
</span><span style="color: rgba(0, 128, 128, 1)">131</span>
<span style="color: rgba(0, 128, 128, 1)">132</span>   sprintf(buf, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">HTTP/1.1 %d %s\r\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, no, desp);
</span><span style="color: rgba(0, 128, 128, 1)">133</span>   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">HTTP/1.1 200 OK\r\n</span>
<span style="color: rgba(0, 128, 128, 1)">134</span> <span style="color: rgba(0, 0, 0, 1)">    bufferevent_write(bev, buf, strlen(buf));
</span><span style="color: rgba(0, 128, 128, 1)">135</span>   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 文件类型</span>
<span style="color: rgba(0, 128, 128, 1)">136</span>   sprintf(buf, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Content-Type:%s\r\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, type);
</span><span style="color: rgba(0, 128, 128, 1)">137</span> <span style="color: rgba(0, 0, 0, 1)">    bufferevent_write(bev, buf, strlen(buf));
</span><span style="color: rgba(0, 128, 128, 1)">138</span>   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 文件大小</span>
<span style="color: rgba(0, 128, 128, 1)">139</span>   sprintf(buf, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Content-Length:%ld\r\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, len);
</span><span style="color: rgba(0, 128, 128, 1)">140</span> <span style="color: rgba(0, 0, 0, 1)">    bufferevent_write(bev, buf, strlen(buf));
</span><span style="color: rgba(0, 128, 128, 1)">141</span>   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Connection: close</span>
<span style="color: rgba(0, 128, 128, 1)">142</span> <span style="color: rgba(0, 0, 0, 1)">    bufferevent_write(bev, _HTTP_CLOSE_, strlen(_HTTP_CLOSE_));
</span><span style="color: rgba(0, 128, 128, 1)">143</span>   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">send \r\n</span>
<span style="color: rgba(0, 128, 128, 1)">144</span>   bufferevent_write(bev, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">\r\n</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">145</span>
<span style="color: rgba(0, 128, 128, 1)">146</span>   <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">147</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">148</span>
<span style="color: rgba(0, 128, 128, 1)">149</span> <span style="color: rgba(0, 0, 255, 1)">int</span> send_error(<span style="color: rgba(0, 0, 255, 1)">struct</span> bufferevent *<span style="color: rgba(0, 0, 0, 1)">bev)
</span><span style="color: rgba(0, 128, 128, 1)">150</span> <span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(0, 128, 128, 1)">151</span>   send_header(bev,<span style="color: rgba(128, 0, 128, 1)">404</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">File Not Found</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">text/html</span><span style="color: rgba(128, 0, 0, 1)">"</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">152</span>   send_file_to_http(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">404.html</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, bev);
</span><span style="color: rgba(0, 128, 128, 1)">153</span>   <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">154</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">155</span>
<span style="color: rgba(0, 128, 128, 1)">156</span> <span style="color: rgba(0, 0, 255, 1)">int</span> send_dir(<span style="color: rgba(0, 0, 255, 1)">struct</span> bufferevent *bev,<span style="color: rgba(0, 0, 255, 1)">const</span> <span style="color: rgba(0, 0, 255, 1)">char</span> *<span style="color: rgba(0, 0, 0, 1)">dirname)
</span><span style="color: rgba(0, 128, 128, 1)">157</span> <span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(0, 128, 128, 1)">158</span>   <span style="color: rgba(0, 0, 255, 1)">char</span> encoded_name[<span style="color: rgba(128, 0, 128, 1)">1024</span><span style="color: rgba(0, 0, 0, 1)">];
</span><span style="color: rgba(0, 128, 128, 1)">159</span>   <span style="color: rgba(0, 0, 255, 1)">char</span> path[<span style="color: rgba(128, 0, 128, 1)">1024</span><span style="color: rgba(0, 0, 0, 1)">];
</span><span style="color: rgba(0, 128, 128, 1)">160</span>   <span style="color: rgba(0, 0, 255, 1)">char</span> timestr[<span style="color: rgba(128, 0, 128, 1)">64</span><span style="color: rgba(0, 0, 0, 1)">];
</span><span style="color: rgba(0, 128, 128, 1)">161</span>   <span style="color: rgba(0, 0, 255, 1)">struct</span><span style="color: rgba(0, 0, 0, 1)"> stat sb;
</span><span style="color: rgba(0, 128, 128, 1)">162</span>   <span style="color: rgba(0, 0, 255, 1)">struct</span> dirent **<span style="color: rgba(0, 0, 0, 1)">dirinfo;
</span><span style="color: rgba(0, 128, 128, 1)">163</span>
<span style="color: rgba(0, 128, 128, 1)">164</span>   <span style="color: rgba(0, 0, 255, 1)">char</span> buf[<span style="color: rgba(128, 0, 128, 1)">4096</span>] = {<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">};
</span><span style="color: rgba(0, 128, 128, 1)">165</span>   sprintf(buf, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">&lt;html&gt;&lt;head&gt;&lt;meta charset=\"utf-8\"&gt;&lt;title&gt;%s&lt;/title&gt;&lt;/head&gt;</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, dirname);
</span><span style="color: rgba(0, 128, 128, 1)">166</span>   sprintf(buf+strlen(buf), <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">&lt;body&gt;&lt;h1&gt;当前目录:%s&lt;/h1&gt;&lt;table&gt;</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, dirname);
</span><span style="color: rgba(0, 128, 128, 1)">167</span>   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">添加目录内容</span>
<span style="color: rgba(0, 128, 128, 1)">168</span>   <span style="color: rgba(0, 0, 255, 1)">int</span> num = scandir(dirname, &amp;<span style="color: rgba(0, 0, 0, 1)">dirinfo, NULL, alphasort);
</span><span style="color: rgba(0, 128, 128, 1)">169</span>   <span style="color: rgba(0, 0, 255, 1)">for</span>(<span style="color: rgba(0, 0, 255, 1)">int</span> i=<span style="color: rgba(128, 0, 128, 1)">0</span>; i&lt;num; ++<span style="color: rgba(0, 0, 0, 1)">i)
</span><span style="color: rgba(0, 128, 128, 1)">170</span> <span style="color: rgba(0, 0, 0, 1)">    {
</span><span style="color: rgba(0, 128, 128, 1)">171</span>         <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 编码</span>
<span style="color: rgba(0, 128, 128, 1)">172</span>         strencode(encoded_name, <span style="color: rgba(0, 0, 255, 1)">sizeof</span>(encoded_name), dirinfo-&gt;<span style="color: rgba(0, 0, 0, 1)">d_name);
</span><span style="color: rgba(0, 128, 128, 1)">173</span>
<span style="color: rgba(0, 128, 128, 1)">174</span>         sprintf(path, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">%s%s</span><span style="color: rgba(128, 0, 0, 1)">"</span>, dirname, dirinfo-&gt;<span style="color: rgba(0, 0, 0, 1)">d_name);
</span><span style="color: rgba(0, 128, 128, 1)">175</span>         printf(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">############# path = %s\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, path);
</span><span style="color: rgba(0, 128, 128, 1)">176</span>         <span style="color: rgba(0, 0, 255, 1)">if</span> (lstat(path, &amp;sb) &lt; <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">177</span> <span style="color: rgba(0, 0, 0, 1)">      {
</span><span style="color: rgba(0, 128, 128, 1)">178</span>             sprintf(buf+<span style="color: rgba(0, 0, 0, 1)">strlen(buf),
</span><span style="color: rgba(0, 128, 128, 1)">179</span>                     <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">&lt;tr&gt;&lt;td&gt;&lt;a href=\"%s\"&gt;%s&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">180</span>                     encoded_name, dirinfo-&gt;<span style="color: rgba(0, 0, 0, 1)">d_name);
</span><span style="color: rgba(0, 128, 128, 1)">181</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)">182</span>         <span style="color: rgba(0, 0, 255, 1)">else</span>
<span style="color: rgba(0, 128, 128, 1)">183</span> <span style="color: rgba(0, 0, 0, 1)">      {
</span><span style="color: rgba(0, 128, 128, 1)">184</span>             strftime(timestr, <span style="color: rgba(0, 0, 255, 1)">sizeof</span><span style="color: rgba(0, 0, 0, 1)">(timestr),
</span><span style="color: rgba(0, 128, 128, 1)">185</span>                      <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">%d%b   %Y%H:%M</span><span style="color: rgba(128, 0, 0, 1)">"</span>, localtime(&amp;<span style="color: rgba(0, 0, 0, 1)">sb.st_mtime));
</span><span style="color: rgba(0, 128, 128, 1)">186</span>             <span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)">(S_ISDIR(sb.st_mode))
</span><span style="color: rgba(0, 128, 128, 1)">187</span> <span style="color: rgba(0, 0, 0, 1)">            {
</span><span style="color: rgba(0, 128, 128, 1)">188</span>               sprintf(buf+<span style="color: rgba(0, 0, 0, 1)">strlen(buf),
</span><span style="color: rgba(0, 128, 128, 1)">189</span>                         <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">&lt;tr&gt;&lt;td&gt;&lt;a href=\"%s/\"&gt;%s/&lt;/a&gt;&lt;/td&gt;&lt;td&gt;%s&lt;/td&gt;&lt;td&gt;%ld&lt;/td&gt;&lt;/tr&gt;\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">190</span>                         encoded_name, dirinfo-&gt;<span style="color: rgba(0, 0, 0, 1)">d_name, timestr, sb.st_size);
</span><span style="color: rgba(0, 128, 128, 1)">191</span> <span style="color: rgba(0, 0, 0, 1)">            }
</span><span style="color: rgba(0, 128, 128, 1)">192</span>             <span style="color: rgba(0, 0, 255, 1)">else</span>
<span style="color: rgba(0, 128, 128, 1)">193</span> <span style="color: rgba(0, 0, 0, 1)">            {
</span><span style="color: rgba(0, 128, 128, 1)">194</span>               sprintf(buf+<span style="color: rgba(0, 0, 0, 1)">strlen(buf),
</span><span style="color: rgba(0, 128, 128, 1)">195</span>                         <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">&lt;tr&gt;&lt;td&gt;&lt;a href=\"%s\"&gt;%s&lt;/a&gt;&lt;/td&gt;&lt;td&gt;%s&lt;/td&gt;&lt;td&gt;%ld&lt;/td&gt;&lt;/tr&gt;\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">196</span>                         encoded_name, dirinfo-&gt;<span style="color: rgba(0, 0, 0, 1)">d_name, timestr, sb.st_size);
</span><span style="color: rgba(0, 128, 128, 1)">197</span> <span style="color: rgba(0, 0, 0, 1)">            }
</span><span style="color: rgba(0, 128, 128, 1)">198</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)">199</span> <span style="color: rgba(0, 0, 0, 1)">      bufferevent_write(bev, buf, strlen(buf));
</span><span style="color: rgba(0, 128, 128, 1)">200</span>         memset(buf, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(0, 0, 255, 1)">sizeof</span><span style="color: rgba(0, 0, 0, 1)">(buf));
</span><span style="color: rgba(0, 128, 128, 1)">201</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">202</span>   sprintf(buf+strlen(buf), <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">&lt;/table&gt;&lt;/body&gt;&lt;/html&gt;</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">203</span> <span style="color: rgba(0, 0, 0, 1)">    bufferevent_write(bev, buf, strlen(buf));
</span><span style="color: rgba(0, 128, 128, 1)">204</span>   printf(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">################# Dir Read OK !!!!!!!!!!!!!!\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">205</span>
<span style="color: rgba(0, 128, 128, 1)">206</span>   <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">207</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">208</span>
<span style="color: rgba(0, 128, 128, 1)">209</span> <span style="color: rgba(0, 0, 255, 1)">void</span> conn_readcb(<span style="color: rgba(0, 0, 255, 1)">struct</span> bufferevent *bev, <span style="color: rgba(0, 0, 255, 1)">void</span> *<span style="color: rgba(0, 0, 0, 1)">user_data)
</span><span style="color: rgba(0, 128, 128, 1)">210</span> <span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(0, 128, 128, 1)">211</span>   printf(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">******************** begin call %s.........\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,__FUNCTION__);
</span><span style="color: rgba(0, 128, 128, 1)">212</span>   <span style="color: rgba(0, 0, 255, 1)">char</span> buf[<span style="color: rgba(128, 0, 128, 1)">4096</span>]={<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">};
</span><span style="color: rgba(0, 128, 128, 1)">213</span>   <span style="color: rgba(0, 0, 255, 1)">char</span> method[<span style="color: rgba(128, 0, 128, 1)">50</span>], path[<span style="color: rgba(128, 0, 128, 1)">4096</span>], protocol[<span style="color: rgba(128, 0, 128, 1)">32</span><span style="color: rgba(0, 0, 0, 1)">];
</span><span style="color: rgba(0, 128, 128, 1)">214</span>   bufferevent_read(bev, buf, <span style="color: rgba(0, 0, 255, 1)">sizeof</span><span style="color: rgba(0, 0, 0, 1)">(buf));
</span><span style="color: rgba(0, 128, 128, 1)">215</span>   printf(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">buf[%s]\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, buf);
</span><span style="color: rgba(0, 128, 128, 1)">216</span>   sscanf(buf, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">%[^ ] %[^ ] %[^ \r\n]</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, method, path, protocol);
</span><span style="color: rgba(0, 128, 128, 1)">217</span>   printf(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">method[%s], path[%s], protocol[%s]\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, method, path, protocol);
</span><span style="color: rgba(0, 128, 128, 1)">218</span>   <span style="color: rgba(0, 0, 255, 1)">if</span>(strcasecmp(method, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">GET</span><span style="color: rgba(128, 0, 0, 1)">"</span>) == <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">219</span> <span style="color: rgba(0, 0, 0, 1)">    {
</span><span style="color: rgba(0, 128, 128, 1)">220</span> <span style="color: rgba(0, 0, 0, 1)">      response_http(bev, method, path);
</span><span style="color: rgba(0, 128, 128, 1)">221</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">222</span>   printf(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">******************** end call %s.........\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, __FUNCTION__);
</span><span style="color: rgba(0, 128, 128, 1)">223</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">224</span>
<span style="color: rgba(0, 128, 128, 1)">225</span> <span style="color: rgba(0, 0, 255, 1)">void</span> conn_eventcb(<span style="color: rgba(0, 0, 255, 1)">struct</span> bufferevent *bev, <span style="color: rgba(0, 0, 255, 1)">short</span> events, <span style="color: rgba(0, 0, 255, 1)">void</span> *<span style="color: rgba(0, 0, 0, 1)">user_data)
</span><span style="color: rgba(0, 128, 128, 1)">226</span> <span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(0, 128, 128, 1)">227</span>   printf(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">******************** begin call %s.........\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, __FUNCTION__);
</span><span style="color: rgba(0, 128, 128, 1)">228</span>   <span style="color: rgba(0, 0, 255, 1)">if</span> (events &amp;<span style="color: rgba(0, 0, 0, 1)"> BEV_EVENT_EOF)
</span><span style="color: rgba(0, 128, 128, 1)">229</span> <span style="color: rgba(0, 0, 0, 1)">    {
</span><span style="color: rgba(0, 128, 128, 1)">230</span>         printf(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Connection closed.\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">231</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">232</span>   <span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (events &amp;<span style="color: rgba(0, 0, 0, 1)"> BEV_EVENT_ERROR)
</span><span style="color: rgba(0, 128, 128, 1)">233</span> <span style="color: rgba(0, 0, 0, 1)">    {
</span><span style="color: rgba(0, 128, 128, 1)">234</span>         printf(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Got an error on the connection: %s\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">235</span> <span style="color: rgba(0, 0, 0, 1)">               strerror(errno));
</span><span style="color: rgba(0, 128, 128, 1)">236</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">237</span>
<span style="color: rgba(0, 128, 128, 1)">238</span> <span style="color: rgba(0, 0, 0, 1)">    bufferevent_free(bev);
</span><span style="color: rgba(0, 128, 128, 1)">239</span>   printf(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">******************** end call %s.........\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, __FUNCTION__);
</span><span style="color: rgba(0, 128, 128, 1)">240</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">241</span>
<span style="color: rgba(0, 128, 128, 1)">242</span> <span style="color: rgba(0, 0, 255, 1)">void</span> signal_cb(evutil_socket_t sig, <span style="color: rgba(0, 0, 255, 1)">short</span> events, <span style="color: rgba(0, 0, 255, 1)">void</span> *<span style="color: rgba(0, 0, 0, 1)">user_data)
</span><span style="color: rgba(0, 128, 128, 1)">243</span> <span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(0, 128, 128, 1)">244</span>   <span style="color: rgba(0, 0, 255, 1)">struct</span> event_base *<span style="color: rgba(0, 0, 255, 1)">base</span> =<span style="color: rgba(0, 0, 0, 1)"> user_data;
</span><span style="color: rgba(0, 128, 128, 1)">245</span>   <span style="color: rgba(0, 0, 255, 1)">struct</span> timeval delay = { <span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)"> };
</span><span style="color: rgba(0, 128, 128, 1)">246</span>
<span style="color: rgba(0, 128, 128, 1)">247</span>   printf(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Caught an interrupt signal; exiting cleanly in one seconds.\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">248</span>   event_base_loopexit(<span style="color: rgba(0, 0, 255, 1)">base</span>, &amp;<span style="color: rgba(0, 0, 0, 1)">delay);
</span><span style="color: rgba(0, 128, 128, 1)">249</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">250</span>
<span style="color: rgba(0, 128, 128, 1)">251</span> <span style="color: rgba(0, 0, 255, 1)">void</span> listener_cb(<span style="color: rgba(0, 0, 255, 1)">struct</span> evconnlistener *<span style="color: rgba(0, 0, 0, 1)">listener,
</span><span style="color: rgba(0, 128, 128, 1)">252</span>                  evutil_socket_t fd,<span style="color: rgba(0, 0, 255, 1)">struct</span> sockaddr *sa, <span style="color: rgba(0, 0, 255, 1)">int</span> socklen, <span style="color: rgba(0, 0, 255, 1)">void</span> *<span style="color: rgba(0, 0, 0, 1)">user_data)
</span><span style="color: rgba(0, 128, 128, 1)">253</span> <span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(0, 128, 128, 1)">254</span>   printf(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">******************** begin call-------%s\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,__FUNCTION__);
</span><span style="color: rgba(0, 128, 128, 1)">255</span>   <span style="color: rgba(0, 0, 255, 1)">struct</span> event_base *<span style="color: rgba(0, 0, 255, 1)">base</span> =<span style="color: rgba(0, 0, 0, 1)"> user_data;
</span><span style="color: rgba(0, 128, 128, 1)">256</span>   <span style="color: rgba(0, 0, 255, 1)">struct</span> bufferevent *<span style="color: rgba(0, 0, 0, 1)">bev;
</span><span style="color: rgba(0, 128, 128, 1)">257</span>   printf(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">fd is %d\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,fd);
</span><span style="color: rgba(0, 128, 128, 1)">258</span>   bev = bufferevent_socket_new(<span style="color: rgba(0, 0, 255, 1)">base</span><span style="color: rgba(0, 0, 0, 1)">, fd, BEV_OPT_CLOSE_ON_FREE);
</span><span style="color: rgba(0, 128, 128, 1)">259</span>   <span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 0, 0, 1)">bev)
</span><span style="color: rgba(0, 128, 128, 1)">260</span> <span style="color: rgba(0, 0, 0, 1)">    {
</span><span style="color: rgba(0, 128, 128, 1)">261</span>         fprintf(stderr, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Error constructing bufferevent!</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">262</span>         event_base_loopbreak(<span style="color: rgba(0, 0, 255, 1)">base</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">263</span>         <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">264</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">265</span>   bufferevent_flush(bev, EV_READ |<span style="color: rgba(0, 0, 0, 1)"> EV_WRITE, BEV_NORMAL);
</span><span style="color: rgba(0, 128, 128, 1)">266</span> <span style="color: rgba(0, 0, 0, 1)">    bufferevent_setcb(bev, conn_readcb, NULL, conn_eventcb, NULL);
</span><span style="color: rgba(0, 128, 128, 1)">267</span>   bufferevent_enable(bev, EV_READ |<span style="color: rgba(0, 0, 0, 1)"> EV_WRITE);
</span><span style="color: rgba(0, 128, 128, 1)">268</span>
<span style="color: rgba(0, 128, 128, 1)">269</span>   printf(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">******************** end call-------%s\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,__FUNCTION__);
</span><span style="color: rgba(0, 128, 128, 1)">270</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">271</span>
<span style="color: rgba(0, 128, 128, 1)">272</span> <span style="color: rgba(0, 128, 0, 1)">/*</span>
<span style="color: rgba(0, 128, 128, 1)">273</span> <span style="color: rgba(0, 128, 0, 1)"> * 这里的内容是处理%20之类的东西!是"解码"过程。
</span><span style="color: rgba(0, 128, 128, 1)">274</span> <span style="color: rgba(0, 128, 0, 1)"> * %20 URL编码中的‘ ’(space)
</span><span style="color: rgba(0, 128, 128, 1)">275</span> <span style="color: rgba(0, 128, 0, 1)"> * %21 '!' %22 '"' %23 '#' %24 '$'
</span><span style="color: rgba(0, 128, 128, 1)">276</span> <span style="color: rgba(0, 128, 0, 1)"> * %25 '%' %26 '&amp;' %27 ''' %28 '('......
</span><span style="color: rgba(0, 128, 128, 1)">277</span> <span style="color: rgba(0, 128, 0, 1)"> * 相关知识html中的‘ ’(space)是&amp;nbsp
</span><span style="color: rgba(0, 128, 128, 1)">278</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 128, 128, 1)">279</span> <span style="color: rgba(0, 0, 255, 1)">void</span> strdecode(<span style="color: rgba(0, 0, 255, 1)">char</span> *to, <span style="color: rgba(0, 0, 255, 1)">char</span> *<span style="color: rgba(0, 0, 255, 1)">from</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">280</span> <span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(0, 128, 128, 1)">281</span>   <span style="color: rgba(0, 0, 255, 1)">for</span> ( ; *<span style="color: rgba(0, 0, 255, 1)">from</span> != <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">\0</span><span style="color: rgba(128, 0, 0, 1)">'</span>; ++to, ++<span style="color: rgba(0, 0, 255, 1)">from</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">282</span> <span style="color: rgba(0, 0, 0, 1)">    {
</span><span style="color: rgba(0, 128, 128, 1)">283</span>         <span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">from</span>[<span style="color: rgba(128, 0, 128, 1)">0</span>] == <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">%</span><span style="color: rgba(128, 0, 0, 1)">'</span> &amp;&amp; isxdigit(<span style="color: rgba(0, 0, 255, 1)">from</span>[<span style="color: rgba(128, 0, 128, 1)">1</span>]) &amp;&amp; isxdigit(<span style="color: rgba(0, 0, 255, 1)">from</span>[<span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">]))
</span><span style="color: rgba(0, 128, 128, 1)">284</span> <span style="color: rgba(0, 0, 0, 1)">      {
</span><span style="color: rgba(0, 128, 128, 1)">285</span>             <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 依次判断from中 %20 三个字符</span>
<span style="color: rgba(0, 128, 128, 1)">286</span>             *to = hexit(<span style="color: rgba(0, 0, 255, 1)">from</span>[<span style="color: rgba(128, 0, 128, 1)">1</span>])*<span style="color: rgba(128, 0, 128, 1)">16</span> + hexit(<span style="color: rgba(0, 0, 255, 1)">from</span>[<span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">]);
</span><span style="color: rgba(0, 128, 128, 1)">287</span>             <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 移过已经处理的两个字符(%21指针指向1),表达式3的++from还会再向后移一个字符</span>
<span style="color: rgba(0, 128, 128, 1)">288</span>             <span style="color: rgba(0, 0, 255, 1)">from</span> += <span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">289</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)">290</span>         <span style="color: rgba(0, 0, 255, 1)">else</span>
<span style="color: rgba(0, 128, 128, 1)">291</span> <span style="color: rgba(0, 0, 0, 1)">      {
</span><span style="color: rgba(0, 128, 128, 1)">292</span>             *to = *<span style="color: rgba(0, 0, 255, 1)">from</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">293</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)">294</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">295</span>   *to = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">\0</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">296</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">297</span>
<span style="color: rgba(0, 128, 128, 1)">298</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">16进制数转化为10进制, return 0不会出现</span>
<span style="color: rgba(0, 128, 128, 1)">299</span> <span style="color: rgba(0, 0, 255, 1)">int</span> hexit(<span style="color: rgba(0, 0, 255, 1)">char</span><span style="color: rgba(0, 0, 0, 1)"> c)
</span><span style="color: rgba(0, 128, 128, 1)">300</span> <span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(0, 128, 128, 1)">301</span>   <span style="color: rgba(0, 0, 255, 1)">if</span> (c &gt;= <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">0</span><span style="color: rgba(128, 0, 0, 1)">'</span> &amp;&amp; c &lt;= <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">9</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">302</span>         <span style="color: rgba(0, 0, 255, 1)">return</span> c - <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">0</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">303</span>   <span style="color: rgba(0, 0, 255, 1)">if</span> (c &gt;= <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">a</span><span style="color: rgba(128, 0, 0, 1)">'</span> &amp;&amp; c &lt;= <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">f</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">304</span>         <span style="color: rgba(0, 0, 255, 1)">return</span> c - <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">a</span><span style="color: rgba(128, 0, 0, 1)">'</span> + <span style="color: rgba(128, 0, 128, 1)">10</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">305</span>   <span style="color: rgba(0, 0, 255, 1)">if</span> (c &gt;= <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">A</span><span style="color: rgba(128, 0, 0, 1)">'</span> &amp;&amp; c &lt;= <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">F</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">306</span>         <span style="color: rgba(0, 0, 255, 1)">return</span> c - <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">A</span><span style="color: rgba(128, 0, 0, 1)">'</span> + <span style="color: rgba(128, 0, 128, 1)">10</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">307</span>
<span style="color: rgba(0, 128, 128, 1)">308</span>   <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">309</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">310</span>
<span style="color: rgba(0, 128, 128, 1)">311</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> "编码",用作回写浏览器的时候,将除字母数字及/_.-~以外的字符转义后回写。
</span><span style="color: rgba(0, 128, 128, 1)">312</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> strencode(encoded_name, sizeof(encoded_name), name);</span>
<span style="color: rgba(0, 128, 128, 1)">313</span> <span style="color: rgba(0, 0, 255, 1)">void</span> strencode(<span style="color: rgba(0, 0, 255, 1)">char</span>* to, size_t tosize, <span style="color: rgba(0, 0, 255, 1)">const</span> <span style="color: rgba(0, 0, 255, 1)">char</span>* <span style="color: rgba(0, 0, 255, 1)">from</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">314</span> <span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(0, 128, 128, 1)">315</span>   <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> tolen;
</span><span style="color: rgba(0, 128, 128, 1)">316</span>
<span style="color: rgba(0, 128, 128, 1)">317</span>   <span style="color: rgba(0, 0, 255, 1)">for</span> (tolen = <span style="color: rgba(128, 0, 128, 1)">0</span>; *<span style="color: rgba(0, 0, 255, 1)">from</span> != <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">\0</span><span style="color: rgba(128, 0, 0, 1)">'</span> &amp;&amp; tolen + <span style="color: rgba(128, 0, 128, 1)">4</span> &lt; tosize; ++<span style="color: rgba(0, 0, 255, 1)">from</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">318</span> <span style="color: rgba(0, 0, 0, 1)">    {
</span><span style="color: rgba(0, 128, 128, 1)">319</span>         <span style="color: rgba(0, 0, 255, 1)">if</span> (isalnum(*<span style="color: rgba(0, 0, 255, 1)">from</span>) || strchr(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/_.-~</span><span style="color: rgba(128, 0, 0, 1)">"</span>, *<span style="color: rgba(0, 0, 255, 1)">from</span>) != (<span style="color: rgba(0, 0, 255, 1)">char</span>*)<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">320</span> <span style="color: rgba(0, 0, 0, 1)">      {
</span><span style="color: rgba(0, 128, 128, 1)">321</span>             *to = *<span style="color: rgba(0, 0, 255, 1)">from</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">322</span>             ++<span style="color: rgba(0, 0, 0, 1)">to;
</span><span style="color: rgba(0, 128, 128, 1)">323</span>             ++<span style="color: rgba(0, 0, 0, 1)">tolen;
</span><span style="color: rgba(0, 128, 128, 1)">324</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)">325</span>         <span style="color: rgba(0, 0, 255, 1)">else</span>
<span style="color: rgba(0, 128, 128, 1)">326</span> <span style="color: rgba(0, 0, 0, 1)">      {
</span><span style="color: rgba(0, 128, 128, 1)">327</span>             sprintf(to, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">%%%02x</span><span style="color: rgba(128, 0, 0, 1)">"</span>, (<span style="color: rgba(0, 0, 255, 1)">int</span>) *<span style="color: rgba(0, 0, 255, 1)">from</span> &amp; <span style="color: rgba(128, 0, 128, 1)">0xff</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">328</span>             to += <span style="color: rgba(128, 0, 128, 1)">3</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">329</span>             tolen += <span style="color: rgba(128, 0, 128, 1)">3</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">330</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)">331</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">332</span>   *to = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">\0</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">333</span> }</pre>
</div>
<span class="cnblogs_code_collapse">libevent_http.c</span></div>
<div class="cnblogs_code"><img id="code_img_closed_98530b1e-f36d-4d2a-a622-f10a06bee992" class="code_img_closed lazyload" alt="" data-src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif"><img id="code_img_opened_98530b1e-f36d-4d2a-a622-f10a06bee992" class="code_img_opened lazyload" style="display: none" alt="" data-src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif">
<div id="cnblogs_code_open_98530b1e-f36d-4d2a-a622-f10a06bee992" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 0, 1)">#ifndef _LIBEVENT_HTTP_H
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span> <span style="color: rgba(0, 0, 255, 1)">#define</span> _LIBEVENT_HTTP_H
<span style="color: rgba(0, 128, 128, 1)"> 3</span>
<span style="color: rgba(0, 128, 128, 1)"> 4</span> #include &lt;event2/<span style="color: rgba(0, 0, 255, 1)">event</span>.h&gt;
<span style="color: rgba(0, 128, 128, 1)"> 5</span>
<span style="color: rgba(0, 128, 128, 1)"> 6</span> <span style="color: rgba(0, 0, 255, 1)">void</span> conn_eventcb(<span style="color: rgba(0, 0, 255, 1)">struct</span> bufferevent *bev, <span style="color: rgba(0, 0, 255, 1)">short</span> events, <span style="color: rgba(0, 0, 255, 1)">void</span> *<span style="color: rgba(0, 0, 0, 1)">user_data);
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span>
<span style="color: rgba(0, 128, 128, 1)"> 8</span> <span style="color: rgba(0, 0, 255, 1)">void</span> conn_readcb(<span style="color: rgba(0, 0, 255, 1)">struct</span> bufferevent *bev, <span style="color: rgba(0, 0, 255, 1)">void</span> *<span style="color: rgba(0, 0, 0, 1)">user_data);
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span>
<span style="color: rgba(0, 128, 128, 1)">10</span> <span style="color: rgba(0, 0, 255, 1)">const</span> <span style="color: rgba(0, 0, 255, 1)">char</span> *get_file_type(<span style="color: rgba(0, 0, 255, 1)">char</span> *<span style="color: rgba(0, 0, 0, 1)">name);
</span><span style="color: rgba(0, 128, 128, 1)">11</span>
<span style="color: rgba(0, 128, 128, 1)">12</span> <span style="color: rgba(0, 0, 255, 1)">int</span> hexit(<span style="color: rgba(0, 0, 255, 1)">char</span><span style="color: rgba(0, 0, 0, 1)"> c);
</span><span style="color: rgba(0, 128, 128, 1)">13</span>
<span style="color: rgba(0, 128, 128, 1)">14</span> <span style="color: rgba(0, 0, 255, 1)">void</span> listener_cb(<span style="color: rgba(0, 0, 255, 1)">struct</span> evconnlistener *<span style="color: rgba(0, 0, 0, 1)">listener, evutil_socket_t fd,
</span><span style="color: rgba(0, 128, 128, 1)">15</span>                  <span style="color: rgba(0, 0, 255, 1)">struct</span> sockaddr *sa, <span style="color: rgba(0, 0, 255, 1)">int</span> socklen, <span style="color: rgba(0, 0, 255, 1)">void</span> *<span style="color: rgba(0, 0, 0, 1)">user_data);
</span><span style="color: rgba(0, 128, 128, 1)">16</span>
<span style="color: rgba(0, 128, 128, 1)">17</span> <span style="color: rgba(0, 0, 255, 1)">int</span> response_http(<span style="color: rgba(0, 0, 255, 1)">struct</span> bufferevent *bev, <span style="color: rgba(0, 0, 255, 1)">const</span> <span style="color: rgba(0, 0, 255, 1)">char</span> *method, <span style="color: rgba(0, 0, 255, 1)">char</span> *<span style="color: rgba(0, 0, 0, 1)">path);
</span><span style="color: rgba(0, 128, 128, 1)">18</span>
<span style="color: rgba(0, 128, 128, 1)">19</span> <span style="color: rgba(0, 0, 255, 1)">int</span> send_dir(<span style="color: rgba(0, 0, 255, 1)">struct</span> bufferevent *bev,<span style="color: rgba(0, 0, 255, 1)">const</span> <span style="color: rgba(0, 0, 255, 1)">char</span> *<span style="color: rgba(0, 0, 0, 1)">dirname);
</span><span style="color: rgba(0, 128, 128, 1)">20</span>
<span style="color: rgba(0, 128, 128, 1)">21</span> <span style="color: rgba(0, 0, 255, 1)">int</span> send_error(<span style="color: rgba(0, 0, 255, 1)">struct</span> bufferevent *<span style="color: rgba(0, 0, 0, 1)">bev);
</span><span style="color: rgba(0, 128, 128, 1)">22</span>
<span style="color: rgba(0, 128, 128, 1)">23</span> <span style="color: rgba(0, 0, 255, 1)">int</span> send_file_to_http(<span style="color: rgba(0, 0, 255, 1)">const</span> <span style="color: rgba(0, 0, 255, 1)">char</span> *filename, <span style="color: rgba(0, 0, 255, 1)">struct</span> bufferevent *<span style="color: rgba(0, 0, 0, 1)">bev);
</span><span style="color: rgba(0, 128, 128, 1)">24</span>
<span style="color: rgba(0, 128, 128, 1)">25</span> <span style="color: rgba(0, 0, 255, 1)">int</span> send_header(<span style="color: rgba(0, 0, 255, 1)">struct</span> bufferevent *bev, <span style="color: rgba(0, 0, 255, 1)">int</span> no, <span style="color: rgba(0, 0, 255, 1)">const</span> <span style="color: rgba(0, 0, 255, 1)">char</span>* desp, <span style="color: rgba(0, 0, 255, 1)">const</span> <span style="color: rgba(0, 0, 255, 1)">char</span> *type, <span style="color: rgba(0, 0, 255, 1)">long</span><span style="color: rgba(0, 0, 0, 1)"> len);
</span><span style="color: rgba(0, 128, 128, 1)">26</span>
<span style="color: rgba(0, 128, 128, 1)">27</span> <span style="color: rgba(0, 0, 255, 1)">void</span> signal_cb(evutil_socket_t sig, <span style="color: rgba(0, 0, 255, 1)">short</span> events, <span style="color: rgba(0, 0, 255, 1)">void</span> *<span style="color: rgba(0, 0, 0, 1)">user_data);
</span><span style="color: rgba(0, 128, 128, 1)">28</span>
<span style="color: rgba(0, 128, 128, 1)">29</span> <span style="color: rgba(0, 0, 255, 1)">void</span> strdecode(<span style="color: rgba(0, 0, 255, 1)">char</span> *to, <span style="color: rgba(0, 0, 255, 1)">char</span> *<span style="color: rgba(0, 0, 255, 1)">from</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">30</span>
<span style="color: rgba(0, 128, 128, 1)">31</span> <span style="color: rgba(0, 0, 255, 1)">void</span> strencode(<span style="color: rgba(0, 0, 255, 1)">char</span>* to, size_t tosize, <span style="color: rgba(0, 0, 255, 1)">const</span> <span style="color: rgba(0, 0, 255, 1)">char</span>* <span style="color: rgba(0, 0, 255, 1)">from</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">32</span>
<span style="color: rgba(0, 128, 128, 1)">33</span> <span style="color: rgba(0, 0, 255, 1)">#endif</span></pre>
</div>
<span class="cnblogs_code_collapse">libevent_http.h</span></div>
<div class="cnblogs_code"><img id="code_img_closed_69c24d0a-a084-4701-b4ce-b9d9e0d665e5" class="code_img_closed lazyload" alt="" data-src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif"><img id="code_img_opened_69c24d0a-a084-4701-b4ce-b9d9e0d665e5" class="code_img_opened lazyload" style="display: none" alt="" data-src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif">
<div id="cnblogs_code_open_69c24d0a-a084-4701-b4ce-b9d9e0d665e5" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> #include &lt;stdio.h&gt;
<span style="color: rgba(0, 128, 128, 1)"> 2</span> #include &lt;unistd.h&gt;
<span style="color: rgba(0, 128, 128, 1)"> 3</span> #include &lt;arpa/inet.h&gt;
<span style="color: rgba(0, 128, 128, 1)"> 4</span> #include &lt;stdlib.h&gt;
<span style="color: rgba(0, 128, 128, 1)"> 5</span> #include &lt;<span style="color: rgba(0, 0, 255, 1)">string</span>.h&gt;
<span style="color: rgba(0, 128, 128, 1)"> 6</span> #include &lt;signal.h&gt;
<span style="color: rgba(0, 128, 128, 1)"> 7</span> #include &lt;event2/bufferevent.h&gt;
<span style="color: rgba(0, 128, 128, 1)"> 8</span> #include &lt;event2/listener.h&gt;
<span style="color: rgba(0, 128, 128, 1)"> 9</span> #include &lt;event2/<span style="color: rgba(0, 0, 255, 1)">event</span>.h&gt;
<span style="color: rgba(0, 128, 128, 1)">10</span> #include <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">libevent_http.h</span><span style="color: rgba(128, 0, 0, 1)">"</span>
<span style="color: rgba(0, 128, 128, 1)">11</span>
<span style="color: rgba(0, 128, 128, 1)">12</span> <span style="color: rgba(0, 0, 255, 1)">int</span> main(<span style="color: rgba(0, 0, 255, 1)">int</span> argc, <span style="color: rgba(0, 0, 255, 1)">char</span> **<span style="color: rgba(0, 0, 0, 1)">argv)
</span><span style="color: rgba(0, 128, 128, 1)">13</span> <span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(0, 128, 128, 1)">14</span>   <span style="color: rgba(0, 0, 255, 1)">if</span>(argc &lt; <span style="color: rgba(128, 0, 128, 1)">3</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">15</span> <span style="color: rgba(0, 0, 0, 1)">    {
</span><span style="color: rgba(0, 128, 128, 1)">16</span>         printf(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">./event_http port path\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">17</span>         <span style="color: rgba(0, 0, 255, 1)">return</span> -<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">18</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">19</span>   <span style="color: rgba(0, 0, 255, 1)">if</span>(chdir(argv[<span style="color: rgba(128, 0, 128, 1)">2</span>]) &lt; <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">) {
</span><span style="color: rgba(0, 128, 128, 1)">20</span>         printf(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">dir is not exists: %s\n</span><span style="color: rgba(128, 0, 0, 1)">"</span>, argv[<span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">]);
</span><span style="color: rgba(0, 128, 128, 1)">21</span>         perror(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">chdir err:</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">22</span>         <span style="color: rgba(0, 0, 255, 1)">return</span> -<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">23</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">24</span>
<span style="color: rgba(0, 128, 128, 1)">25</span>   <span style="color: rgba(0, 0, 255, 1)">struct</span> event_base *<span style="color: rgba(0, 0, 255, 1)">base</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">26</span>   <span style="color: rgba(0, 0, 255, 1)">struct</span> evconnlistener *<span style="color: rgba(0, 0, 0, 1)">listener;
</span><span style="color: rgba(0, 128, 128, 1)">27</span>   <span style="color: rgba(0, 0, 255, 1)">struct</span> <span style="color: rgba(0, 0, 255, 1)">event</span> *<span style="color: rgba(0, 0, 0, 1)">signal_event;
</span><span style="color: rgba(0, 128, 128, 1)">28</span>
<span style="color: rgba(0, 128, 128, 1)">29</span>   <span style="color: rgba(0, 0, 255, 1)">struct</span><span style="color: rgba(0, 0, 0, 1)"> sockaddr_in sin;
</span><span style="color: rgba(0, 128, 128, 1)">30</span>   <span style="color: rgba(0, 0, 255, 1)">base</span> =<span style="color: rgba(0, 0, 0, 1)"> event_base_new();
</span><span style="color: rgba(0, 128, 128, 1)">31</span>   <span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 0, 255, 1)">base</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">32</span> <span style="color: rgba(0, 0, 0, 1)">    {
</span><span style="color: rgba(0, 128, 128, 1)">33</span>         fprintf(stderr, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Could not initialize libevent!\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">34</span>         <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">35</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">36</span>
<span style="color: rgba(0, 128, 128, 1)">37</span>   memset(&amp;sin, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(0, 0, 255, 1)">sizeof</span><span style="color: rgba(0, 0, 0, 1)">(sin));
</span><span style="color: rgba(0, 128, 128, 1)">38</span>   sin.sin_family =<span style="color: rgba(0, 0, 0, 1)"> AF_INET;
</span><span style="color: rgba(0, 128, 128, 1)">39</span>   sin.sin_port = htons(atoi(argv[<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">]));
</span><span style="color: rgba(0, 128, 128, 1)">40</span>
<span style="color: rgba(0, 128, 128, 1)">41</span>   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 创建监听的套接字,绑定,监听,接受连接请求</span>
<span style="color: rgba(0, 128, 128, 1)">42</span>   listener = evconnlistener_new_bind(<span style="color: rgba(0, 0, 255, 1)">base</span>, listener_cb, (<span style="color: rgba(0, 0, 255, 1)">void</span> *)<span style="color: rgba(0, 0, 255, 1)">base</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">43</span>                     LEV_OPT_REUSEABLE | LEV_OPT_CLOSE_ON_FREE, -<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">44</span>                     (<span style="color: rgba(0, 0, 255, 1)">struct</span> sockaddr*)&amp;sin, <span style="color: rgba(0, 0, 255, 1)">sizeof</span><span style="color: rgba(0, 0, 0, 1)">(sin));
</span><span style="color: rgba(0, 128, 128, 1)">45</span>   <span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 0, 0, 1)">listener)
</span><span style="color: rgba(0, 128, 128, 1)">46</span> <span style="color: rgba(0, 0, 0, 1)">    {
</span><span style="color: rgba(0, 128, 128, 1)">47</span>         fprintf(stderr, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Could not create a listener!\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">48</span>         <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">49</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">50</span>
<span style="color: rgba(0, 128, 128, 1)">51</span>   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 创建信号事件, 捕捉并处理</span>
<span style="color: rgba(0, 128, 128, 1)">52</span>   signal_event = evsignal_new(<span style="color: rgba(0, 0, 255, 1)">base</span>, SIGINT, signal_cb, (<span style="color: rgba(0, 0, 255, 1)">void</span> *)<span style="color: rgba(0, 0, 255, 1)">base</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">53</span>   <span style="color: rgba(0, 0, 255, 1)">if</span> (!signal_event || event_add(signal_event, NULL)&lt;<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">54</span> <span style="color: rgba(0, 0, 0, 1)">    {
</span><span style="color: rgba(0, 128, 128, 1)">55</span>         fprintf(stderr, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Could not create/add a signal event!\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">56</span>         <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">57</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">58</span>
<span style="color: rgba(0, 128, 128, 1)">59</span>   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 事件循环</span>
<span style="color: rgba(0, 128, 128, 1)">60</span>   event_base_dispatch(<span style="color: rgba(0, 0, 255, 1)">base</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">61</span>
<span style="color: rgba(0, 128, 128, 1)">62</span> <span style="color: rgba(0, 0, 0, 1)">    evconnlistener_free(listener);
</span><span style="color: rgba(0, 128, 128, 1)">63</span> <span style="color: rgba(0, 0, 0, 1)">    event_free(signal_event);
</span><span style="color: rgba(0, 128, 128, 1)">64</span>   event_base_free(<span style="color: rgba(0, 0, 255, 1)">base</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">65</span>
<span style="color: rgba(0, 128, 128, 1)">66</span>   printf(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">done\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">67</span>
<span style="color: rgba(0, 128, 128, 1)">68</span>   <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">69</span> }</pre>
</div>
<span class="cnblogs_code_collapse">main.c</span></div>
<p><strong>补充:</strong></p>
<p>(1)recv的flag</p>
<div class="cnblogs_code">
<pre>n = recv(sock, <span style="color: rgba(255, 0, 0, 1)">&amp;c</span><span style="color: rgba(0, 0, 0, 1)">, 1, MSG_PEEK);
- flag == MSG_PEEK
- recv从缓冲区总读数据 - 拷贝的方式

1234567890
recv(fd, buf, size, 0);
- 没数据了
recv(fd, buf, size, MSG_PEEK);
- 有, 1234567890</span></pre>
</div>
<p>(2)sscanf 函数</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">函数描述:读取格式化的字符串中的数据。
函数原型:
    int sscanf(   
      const char *buffer,   
      const char *format, [ argument ] ...   
    );

1. 取到指定字符为止的字符串。如在下例中,取遇到空格为止字符串。
   sscanf("123456&nbsp;abcdedf",&nbsp;"%[^&nbsp;]",&nbsp;buf);
   printf("%s\n",&nbsp;buf);
   结果为:123456
2. 取仅包含指定字符集的字符串。如在下例中,取仅包含1到9和小写字母的字符串。
   sscanf("123456abcdedfBCDEF",&nbsp;"%",&nbsp;buf);
   printf("%s\n",&nbsp;buf);
   结果为:123456abcdedf
3. 取到指定字符集为止的字符串。如在下例中,取遇到大写字母为止的字符串。
   sscanf("123456abcdedfBCDEF",&nbsp;"%[^A-Z]",&nbsp;buf);
   printf("%s\n",&nbsp;buf);
   结果为:123456abcdedf</span></pre>
</div>
<p>(3)strftime 函数</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">头文件: time.h
函数功能:将时间格式化,或者说格式化一个时间字符串。
函数原型:
    size_t strftime(
      </span><span style="color: rgba(0, 0, 255, 1)">char</span> *<span style="color: rgba(0, 0, 0, 1)">strDest,
      size_t maxsize,
      </span><span style="color: rgba(0, 0, 255, 1)">const</span> <span style="color: rgba(0, 0, 255, 1)">char</span> *<span style="color: rgba(0, 0, 0, 1)">format,
      </span><span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 255, 1)">struct</span> tm *<span style="color: rgba(0, 0, 0, 1)">timeptr
    );

    </span>-<span style="color: rgba(0, 0, 0, 1)"> format
          </span>%<span style="color: rgba(0, 0, 0, 1)">a 星期几的简写
          </span>%<span style="color: rgba(0, 0, 0, 1)">A 星期几的全称
          </span>%<span style="color: rgba(0, 0, 0, 1)">b 月份的简写
          </span>%<span style="color: rgba(0, 0, 0, 1)">B 月份的全称
          </span>%<span style="color: rgba(0, 0, 0, 1)">c 标准的日期的时间串
          </span>%<span style="color: rgba(0, 0, 0, 1)">C 年份的前两位数字
          </span>%<span style="color: rgba(0, 0, 0, 1)">d 十进制表示的每月的第几天
          </span>%D 月/天/<span style="color: rgba(0, 0, 0, 1)">年
          </span>%<span style="color: rgba(0, 0, 0, 1)">e 在两字符域中,十进制表示的每月的第几天
          </span>%F 年-月-<span style="color: rgba(0, 0, 0, 1)">日
          </span>%<span style="color: rgba(0, 0, 0, 1)">g 年份的后两位数字,使用基于周的年
          </span>%<span style="color: rgba(0, 0, 0, 1)">G 年份,使用基于周的年
          </span>%<span style="color: rgba(0, 0, 0, 1)">h 简写的月份名
          </span>%<span style="color: rgba(0, 0, 0, 1)">H 24小时制的小时
          </span>%<span style="color: rgba(0, 0, 0, 1)">I 12小时制的小时
          </span>%<span style="color: rgba(0, 0, 0, 1)">j 十进制表示的每年的第几天
          </span>%<span style="color: rgba(0, 0, 0, 1)">m 十进制表示的月份
          </span>%<span style="color: rgba(0, 0, 0, 1)">M 十时制表示的分钟数
          </span>%<span style="color: rgba(0, 0, 0, 1)">p 本地的AM或PM的等价显示
          </span>%<span style="color: rgba(0, 0, 0, 1)">r 12小时的时间
          </span>%<span style="color: rgba(0, 0, 0, 1)">R 显示小时和分钟:hh:mm
          </span>%<span style="color: rgba(0, 0, 0, 1)">S 十进制的秒数
          </span>%<span style="color: rgba(0, 0, 0, 1)">t 水平制表符
          </span>%<span style="color: rgba(0, 0, 0, 1)">T 显示时分秒:hh:mm:ss
          </span>%<span style="color: rgba(0, 0, 0, 1)">u 每周的第几天,星期一为第一天 (值从1到7,星期一为1)
          </span>%<span style="color: rgba(0, 0, 0, 1)">U 第年的第几周,把星期日作为第一天(值从0到53)
          </span>%<span style="color: rgba(0, 0, 0, 1)">V 每年的第几周,使用基于周的年
          </span>%<span style="color: rgba(0, 0, 0, 1)">w 十进制表示的星期几(值从0到6,星期天为0)
          </span>%<span style="color: rgba(0, 0, 0, 1)">W 每年的第几周,把星期一做为第一天(值从0到53)
          </span>%<span style="color: rgba(0, 0, 0, 1)">x 标准的日期串
          </span>%<span style="color: rgba(0, 0, 0, 1)">X 标准的时间串
          </span>%<span style="color: rgba(0, 0, 0, 1)">y 不带世纪的十进制年份(值从0到99)
          </span>%<span style="color: rgba(0, 0, 0, 1)">Y 带世纪部分的十制年份
          </span>%z,%Z 时区名称,如果不能得到时区名称则返回空字符。</pre>
</div>
<p>(4)数据转码</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">url在数据传输过程中不支持中文,需要转码。
    </span>-<span style="color: rgba(0, 0, 0, 1)"> 汉字
    </span>-<span style="color: rgba(0, 0, 0, 1)"> 特殊字符
      查看manpage
            man ascii
      要处理可见字符
            从space开始 </span>- <span style="color: rgba(128, 0, 128, 1)">32</span><span style="color: rgba(0, 0, 0, 1)">
            前0</span>-<span style="color: rgba(0, 0, 0, 1)">31个不可见
      不需要转换的特殊字符
            .
            _
            </span>*
            /
            ~
            <span style="color: rgba(128, 0, 128, 1)">0</span>-<span style="color: rgba(128, 0, 128, 1)">9</span><span style="color: rgba(0, 0, 0, 1)">
            a</span>-<span style="color: rgba(0, 0, 0, 1)">z
            A</span>-<span style="color: rgba(0, 0, 0, 1)">Z
      需要转换的字符使用其16进制的值前加</span>%<span style="color: rgba(0, 0, 0, 1)">表示
可以在shell下通过unicode工具查看
安装unicode
    </span>- sudo apt-<span style="color: rgba(0, 0, 255, 1)">get</span> install unicode</pre>
</div>
<p>(5)正则表达式</p>
<p>参见:https://www.jb51.net/tools/regexsc.htm</p>
<p><strong>参考文献:</strong></p>
<ul>
<li>http://www.w3school.com.cn/html/index.asp</li>
<li>http://www.runoob.com/</li>
</ul><br><br>
来源:https://www.cnblogs.com/xuejiale/p/10917407.html
頁: [1]
查看完整版本: Linux C编程之二十一 Linux高并发web服务器开发