这里不是百科全书,所以只会用最简单,最明了的语言,来讲最实用的TCP编程。
Echo
程序太多,就不再重复了,贯穿整个章节的将会是一个 HTTP 服务器
这回是在
Linux
下开发,而不是Windows
epoll
。但是其他的接口还是可以参考的,并且十分的详细。说了贯穿本章节的是一个 HTTP服务器,如此就一定要说说 HTTP协议 了,如果说前面的TCP即使你不懂它的原理也能编写一个能运行且效率不错的TCP程序的话,那么想写一个HTTP服务器,你要是不懂 HTTP协议,简直是寸步难行。
最权威的莫过于 《HTTP权威指南》,你可别想着去看HTTP的标准草案了,那真是神鬼难懂。当然这本书亦是一部大块头,可以选择在网上找一些HTTP协议的资料来补充一些基本知识,再用这本大块头来检索自己需要了解的地方。
简单说一下 HTTP 协议
协议版本号
Connection:
的默认属性方法
GET
POST
HEAD
GET
进行程序的方法编写,有兴趣的可以自己实现POST
方法,我的源代码中也已经完成一半了,但并不打算继续完成。有图有真相
GET / HTTP/1.1\r\n <--- 这是状态行,包括一个请求方法,资源,协议版本
Host: www.wushxin.top\r\n <-- 这是属性头,
Connection: keep-alive\r\n <-- ...
\r\n <-- 一直到空行结束
index.html
),并希望与服务器保持连接。这里的保持连接和 TCP 协议中的保持连接不一样,具体可以去查找资料,简单来说这是一种不可靠的保持连接,双方都可以在做出保证之后,突然断开连接。可以把它当成不靠谱连接,但是表面工作还是要做的。
有图有真相
200 OK\r\n <-- 状态行,包括一个状态码,状态详情
Host: www.wushxin.top\r\n <-- 属性,
Connection: close\r\n <-- ...
Content-Length: 78\r\n <-- 这个属性,代表空行后面数据有多少
\r\n <-- 直到空行
<html><body><p>Hello, That is the Resource which you Request!</body></html>
这是很简单的一种返回报文,Content-Length
属性在这里特别重要!绝对不能缺少,它给对端一种信息就是,这个报文的结束位置在哪里。
在上述报文中,每行的末尾都有\r\n
这是HTTP协议 用来表达行末的一个标志,而且,HTTP协议 的头部和文本部有一个空行\r\n
来进行分割。
以上就是所有我想要介绍的 HTTP协议的内容,有些零散,还是建议去查找一些资料后再来往下看。
epoll
机制,暂时不要管select
和poll
这两个相似功能的机制