如何设计一个符合工信部网站备案系统的网页?
摘要:工信部网站备案系统,完整的网页设计代码,怎样创建网站,做电影网站怎么接广告文章目录 一、Buffer模块1.为什么需要Buffer缓冲区2.Buffer模块的设计3.Buffer模块的实现4.Buffer缓冲区的其它设计方案 二、Socke
工信部网站备案系统,完整的网页设计代码,怎样创建网站,做电影网站怎么接广告文章目录 一、Buffer模块1.为什么需要Buffer缓冲区2.Buffer模块的设计3.Buffer模块的实现4.Buffer缓冲区的其它设计方案 二、Socket模块1.Socket模块的设计2.Socket代码实现 三、Acceptor模块1.Acceptor模块的设计与实现2.Acceptor模块完整代码实现 四、定时器模块1.时间轮的思… 文章目录 一、Buffer模块1.为什么需要Buffer缓冲区2.Buffer模块的设计3.Buffer模块的实现4.Buffer缓冲区的其它设计方案 二、Socket模块1.Socket模块的设计2.Socket代码实现 三、Acceptor模块1.Acceptor模块的设计与实现2.Acceptor模块完整代码实现 四、定时器模块1.时间轮的思想2.TimerTask类3.TimerWheel类 五、线程池模块1.LoopThread类2.LoopThreadPool类 一、Buffer模块
1.为什么需要Buffer缓冲区
我们实现的TCP网络服务器必须要有发送缓冲区和接收缓冲区这一点是毋庸置疑的。考虑以下两种情况
如果服务器没有发送缓冲区那么当服务器想向客户端发送假设100KB的数据时调用操作系统的write接口进行发送。但是如果操作系统准确来说是操作系统的缓冲区只接收了80KB我们服务器还有20KB的数据没有发送出去这个时候只能阻塞在write接口处等待最后20KB数据发送出去。如果有了发送缓冲区我们就能将这20KB的数据再放回发送缓冲区等什么时候操作系统缓冲区能接收新数据了再进行第二次发送。如果服务器没有接收缓冲区由于TCP是面向字节流的协议也就是说它的数据报文是没有明显边界的那么就可能会出现一次接收的数据不完整或者数据粘包的问题这时候我们拿到不完整的数据既不能解析也不能丢弃只有接收缓冲区能让我们缓存这些不完整的数据报文等到下一次对方再发送新数据的时候我们读取到完整的报文时再交给上层进行业务处理。
这两个简单常见的例子就足以说明TCP服务器必须要有Buffer缓冲区。
2.Buffer模块的设计
muduo库的作者陈硕老师在《Linux多线程服务端编程使用muduo C网络库》书中提到muduo Buffer的设计考虑了常见的网络编程需求他试图在易用性和性能之间找一个平衡点目前这个平衡点更偏向于易用性。所以muduo库的Buffer设计要点如下
对外表现是一块连续的内存空间这样更方便代码的编写。Buffer缓冲区的空间大小是可变的支持动态扩容以适应不同大小的消息。虽然服务器需要接收缓冲区和发送缓冲区但我们不希望分开两个缓冲区来写而是希望一块内存空间既能读也能写做到读写配合。
从连续的内存空间、支持动态扩容这两个要点来看Buffer缓冲区底层的数据结构应该选择vector最合适。并且还需要两个index分别代表读位置和写位置这样就能满足一块内存空间的读写配合。有个细节的地方需要注意读位置和写位置的index不应该设置为指针类型或者迭代器类型最好使用下标来表示因为vector如果需要扩容将数据拷贝到新空间会出现迭代器失效的情况需要我们去处理迭代器失效从易用性角度考虑使用下标是最好的。
确定了Buffer的数据结构以后我们可以很容易地想象出Buffer的结构图如下图所示 通过起始位置、读位置reader_index、写位置writer_index、末尾位置我们可以将Buffer分成三部分
读位置之前的空间即起始位置和读位置之间的空间我们称为头部空闲空间读位置和写位置之间的空间我们称为有效数据。这部分存放的就是可读数据写位置之后的空间即写位置和末尾位置之间的空间我们称为尾部空闲空间。
划分完成之后Buffer缓冲区的读写数据方式会变得非常清晰。读位置和写位置之间的空间就是有效数据区域也就是可读数据。当我们要从Buffer缓冲区中读取数据时从读位置reader_index开始向后读取指定的字节读取完以后再将读位置reader_index向后移动读取的字节数。写入也是同理当我们要向Buffer缓冲区中写入数据时从写位置writer_index开始向后写入指定的字节写入完以后再将写位置writer_index向后移动写入的字节数。当读位置reader_index和写位置writer_index相遇的时候说明缓冲区已经没有可读数据了。
