网络编程实战
盛延敏
前大众点评云平台首席架构师
立即订阅
6034 人已学习
课程目录
已完结 39 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 学好网络编程,需要掌握哪些核心问题?
免费
第一模块:基础篇 (9讲)
01 | 追古溯源:TCP/IP和Linux是如何改变世界的?
02 | 网络编程模型:认识客户端-服务器网络模型的基本概念
03丨套接字和地址:像电话和电话号码一样理解它们
04 | TCP三次握手:怎么使用套接字格式建立连接?
05 | 使用套接字进行读写:开始交流吧
06 | 嗨,别忘了UDP这个小兄弟
07 | What? 还有本地套接字?
08 | 工欲善其事必先利其器:学会使用各种工具
09丨答疑篇:学习网络编程前,需要准备哪些东西?
第二模块:提高篇 (10讲)
10 | TIME_WAIT:隐藏在细节下的魔鬼
11 | 优雅地关闭还是粗暴地关闭 ?
12 | 连接无效:使用Keep-Alive还是应用心跳来检测?
13 | 小数据包应对之策:理解TCP协议中的动态数据传输
14丨UDP也可以是“已连接”?
15 | 怎么老是出现“地址已经被使用”?
16 | 如何理解TCP的“流”?
17 | TCP并不总是“可靠”的?
18 | 防人之心不可无:检查数据的有效性
19丨提高篇答疑:如何理解TCP四次挥手?
期中复习周 (2讲)
期中大作业丨动手编写一个自己的程序吧!
免费
期中大作业丨题目以及解答剖析
免费
第三模块:性能篇 (12讲)
20 | 大名⿍⿍的select:看我如何同时感知多个I/O事件
21 | poll:另一种I/O多路复用
22 | 非阻塞I/O:提升性能的加速器
23 | Linux利器:epoll的前世今生
24 | C10K问题:高并发模型设计
25 | 使用阻塞I/O和进程模型:最传统的方式
26 | 使用阻塞I/O和线程模型:换一种轻量的方式
27 | I/O多路复用遇上线程:使用poll单线程处理所有I/O事件
28 | I/O多路复用进阶:子线程使用poll处理连接I/O事件
29 | 渐入佳境:使用epoll和多线程模型
30 | 真正的大杀器:异步I/O探索
31丨性能篇答疑:epoll源码深度剖析
第四模块:实战篇 (4讲)
32 | 自己动手写高性能HTTP服务器(一):设计和思路
33 | 自己动手写高性能HTTP服务器(二):I/O模型和多线程模型实现
34 | 自己动手写高性能HTTP服务器(三):TCP字节流处理和HTTP协议实现
35 | 答疑:编写高性能网络编程框架时,都需要注意哪些问题?
结束语 (1讲)
结束语丨我相信这不是结束,让我们江湖再见
网络编程实战
登录|注册

34 | 自己动手写高性能HTTP服务器(三):TCP字节流处理和HTTP协议实现

盛延敏 2019-10-25
你好,我是盛延敏,这里是网络编程实战第 34 讲,欢迎回来。
这一讲,我们延续第 33 讲的话题,继续解析高性能网络编程框架的字节流处理部分,并为网络编程框架增加 HTTP 相关的功能,在此基础上完成 HTTP 高性能服务器的编写。

buffer 对象

你肯定在各种语言、各种框架里面看到过不同的 buffer 对象,buffer,顾名思义,就是一个缓冲区对象,缓存了从套接字接收来的数据以及需要发往套接字的数据。
如果是从套接字接收来的数据,事件处理回调函数在不断地往 buffer 对象增加数据,同时,应用程序需要不断把 buffer 对象中的数据处理掉,这样,buffer 对象才可以空出新的位置容纳更多的数据。
如果是发往套接字的数据,应用程序不断地往 buffer 对象增加数据,同时,事件处理回调函数不断调用套接字上的发送函数将数据发送出去,减少 buffer 对象中的写入数据。
可见,buffer 对象是同时可以作为输入缓冲(input buffer)和输出缓冲(output buffer)两个方向使用的,只不过,在两种情形下,写入和读出的对象是有区别的。
我在文稿中给出了一张图,描述了 buffer 对象的设计。
下面是 buffer 对象的数据结构。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《网络编程实战》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(9)

  • 传说中的成大大
    第二个问题 才是把我考到了 我感觉现在我对设计模式的理解并不深,但是我现在感受特深的一点就是单一职责原理 buffer类才套接字的处理 tcpconnect应用层面的处理,而且最近在工作中我也是尝试着画流程图 把每个功能进行细分 分到一个流程分支里面只处理一个逻辑
    2019-10-25
    1
  • 夏目
    希望老师加一个客户端请求到服务器响应的全过程流程图包括tcp连接和应用程序处理的流程😁

    作者回复: 大概是指哪个部分?因为客户端还是比较简单的,所以没有做这个。

    2019-11-19
  • chs
    老师不明白缓冲区为什么要这样设计。用两块内存当做缓冲区,一个用于接收数据,另一个用于发送数据。这两种方式的优缺点能说一下吗?

    作者回复: 这里你的理解有点问题,确实是两个buffer对象,一个input_buffer用来接收数据,这个input_buffer对象的写入是框架的handle_read函数来完成的,同时应用程序不端的将input_buffer里的数据取走,这样handle_read就可以不断的将接收缓冲区的数据写入input_buffer。

    另一个buffer对象是output_buffer,应用程序不断的往这个缓冲区里写入待发送的数据,框架里的handle_write函数不端的将缓冲区的数据送到套接字发送缓冲区中。

    缓冲区的设计中,肯定是有一个往缓冲区里写入的,另一个从缓冲区里读取数据,否则就没有缓冲区了,而是临时创建一个个的字节流对象。

    使用缓冲区可以大大减少对内存的消耗。

    2019-11-15
  • 刘晓林
    c语言写bbs网站的年代,真的是太疯狂了,一个一个字符的print(哭脸)

    作者回复: 是有点疯狂。(哭脸)

    2019-11-03
  • 沉淀的梦想
    在ubuntu系统上一运行老师的程序就会出现“interrupted by signal 11: SIGSEGV”错误

    作者回复: 我也是ubuntu系统啊,有同学碰到同样的问题么?

    2019-10-30
    1
  • tt
    嗯,对于第二个问题,因为我是从C++语言开始进入编程的,老师的C代码确实很多都是面向对象的。

    很多模块,比如tcp_connection,对应的头文件中声明的函数,第一个参数都是tcp_connection指针,这就相当于this指针。而相应的以"_new"结尾的函数就相当于C++中的构造函数。
    而结构体里的函数指针,我把它理解为了实现了继承C++中的虚拟基类或类似于java中实现了一个接口。

    画UML图的时候,完全可以用C++的术语进行。

    作者回复: 是的,面向对象写起来简洁许多

    2019-10-28
  • MoonGod
    如果发现当前 channel 没有注册 WRITE 事件,并且当前 tcp_connection 对应的发送缓冲无数据需要发送,就直接调用 write 函数将数据发送出去。
    老师好,这里没有理解,为啥不能做成无论有没有write事件都统一往发送缓冲区写呢,之后如果没有write事件,就再注册一个就好了不是?

    作者回复: 非常好的问题,我发到统一答疑部分了。感谢~

    2019-10-26
  • Steiner
    实在学不动了,我想抄袭老师的创意自己写一个框架,然后慢慢该吧
    (◦`~´◦)

    作者回复: 很好奇学不动的意思是啥

    2019-10-25
    1
  • 我来也
    老师的的c代码看上去是一种享受。
    逻辑很清晰,很佩服函数命名。

    以前我们缓冲区是用的循环,避免频繁的挪动数据,不过要处理好溢出的情况。

    文中好像拼错了单词。
    “只需要看到 http_request 和 http_responsde 结构。”
    “创建了一个 buffe 对象”

    编辑回复: 您好,文章已进行改正,谢谢反馈。

    2019-10-25
收起评论
9
返回
顶部