当前位置: 首页 > news >正文

福建省建设监理网官方网站安装多个wordpress站点

福建省建设监理网官方网站,安装多个wordpress站点,做任务挣钱的网站,百度下载应用简介 Buffer封装了一个可变长的buffer#xff0c;支持廉价的前插操作#xff0c;以及内部挪腾操作避免额外申请空间 使用vector作为缓冲区(可自动调整扩容) 设计图 源码剖析 已经编写好注释 buffer.h // Copyright 2010, Shuo Chen. All rights reserved. // http://c…简介 Buffer封装了一个可变长的buffer支持廉价的前插操作以及内部挪腾操作避免额外申请空间 使用vector作为缓冲区(可自动调整扩容) 设计图 源码剖析 已经编写好注释 buffer.h // Copyright 2010, Shuo Chen. All rights reserved. // http://code.google.com/p/muduo/ // // Use of this source code is governed by a BSD-style license // that can be found in the License file.// Author: Shuo Chen (chenshuo at chenshuo dot com) // // This is a public header file, it must only include public header files.#ifndef MUDUO_NET_BUFFER_H #define MUDUO_NET_BUFFER_H#include muduo/base/copyable.h #include muduo/base/StringPiece.h #include muduo/base/Types.h#include muduo/net/Endian.h#include algorithm #include vector#include assert.h #include string.h //#include unistd.h // ssize_tnamespace muduo { namespace net {/// A buffer class modeled after org.jboss.netty.buffer.ChannelBuffer /// /// code /// ------------------------------------------------------- /// | prependable bytes | readable bytes | writable bytes | /// | | (CONTENT) | | /// ------------------------------------------------------- /// | | | | /// 0 readerIndex writerIndex size /// endcode class Buffer : public muduo::copyable {public:static const size_t kCheapPrepend 8;//预留8字节static const size_t kInitialSize 1024;//缓冲区初始化大小explicit Buffer(size_t initialSize kInitialSize): buffer_(kCheapPrepend initialSize),readerIndex_(kCheapPrepend),writerIndex_(kCheapPrepend){assert(readableBytes() 0);assert(writableBytes() initialSize);assert(prependableBytes() kCheapPrepend);}// implicit copy-ctor, move-ctor, dtor and assignment are fine// NOTE: implicit move-ctor is added in g 4.6void swap(Buffer rhs)//交换缓冲区{buffer_.swap(rhs.buffer_);std::swap(readerIndex_, rhs.readerIndex_);std::swap(writerIndex_, rhs.writerIndex_);}size_t readableBytes() const//剩余可读字节大小{ return writerIndex_ - readerIndex_; }size_t writableBytes() const//剩余可写字节大小{ return buffer_.size() - writerIndex_; }size_t prependableBytes() const//已读字节大小{ return readerIndex_; }const char* peek() const//readIndex{ return begin() readerIndex_; }const char* findCRLF() const{// FIXME: replace with memmem()?const char* crlf std::search(peek(), beginWrite(), kCRLF, kCRLF2);return crlf beginWrite() ? NULL : crlf;}const char* findCRLF(const char* start) const//在start~writeIndex区间寻找kCRLF{assert(peek() start);assert(start beginWrite());// FIXME: replace with memmem()?const char* crlf std::search(start, beginWrite(), kCRLF, kCRLF2);return crlf beginWrite() ? NULL : crlf;}const char* findEOL() const//在readIndex~writeIndex区间寻找\n{const void* eol memchr(peek(), \n, readableBytes());return static_castconst char*(eol);}const char* findEOL(const char* start) const{assert(peek() start);assert(start beginWrite());const void* eol memchr(start, \n, beginWrite() - start);return static_castconst char*(eol);}// retrieve returns void, to prevent// string str(retrieve(readableBytes()), readableBytes());// the evaluation of two functions are unspecifiedvoid retrieve(size_t len)//回收len个字节的数据(可读数据){assert(len readableBytes());if (len readableBytes()){readerIndex_ len;}else{retrieveAll();}}void retrieveUntil(const char* end)//回收readINdex~len区间的数据{assert(peek() end);assert(end beginWrite());retrieve(end - peek());}//回收相应类型大小的数据void retrieveInt64(){retrieve(sizeof(int64_t));}void retrieveInt32(){retrieve(sizeof(int32_t));}void retrieveInt16(){retrieve(sizeof(int16_t));}void retrieveInt8(){retrieve(sizeof(int8_t));}void retrieveAll()//回收所有空间{readerIndex_ kCheapPrepend;writerIndex_ kCheapPrepend;}string retrieveAllAsString()//返回缓冲区所有剩余的数据{return retrieveAsString(readableBytes());}string retrieveAsString(size_t len)//回收len大小的数据,并将这段数据返回{assert(len readableBytes());string result(peek(), len);retrieve(len);return result;}//返回StringPiece类型,该类保存一个char*指针,并保存len长度,并提供一些基础方法(可以理解为低配版std::string)//保存StringPiece toStringPiece() const{return StringPiece(peek(), static_castint(readableBytes()));}void append(const StringPiece str){append(str.data(), str.size());}void append(const char* /*restrict*/ data, size_t len){ensureWritableBytes(len);//确保有可写字节大小的空间std::copy(data, datalen, beginWrite());//将追加数据加入缓冲区hasWritten(len);//更新writerIndex_}void append(const void* /*restrict*/ data, size_t len){append(static_castconst char*(data), len);}void ensureWritableBytes(size_t len)//确保有可写字节大小的空间{//如果可写空间大于len则什么也不干,小于则调整bufferif (writableBytes() len){makeSpace(len);}assert(writableBytes() len);}char* beginWrite()//writeIndex{ return begin() writerIndex_; }const char* beginWrite() const//writeIndex{ return begin() writerIndex_; }void hasWritten(size_t len)//writerIndex_追加移动len个字节{assert(len writableBytes());writerIndex_ len;}void unwrite(size_t len)//writerIndex_减少移动len个字节{assert(len readableBytes());writerIndex_ - len;}////// Append int64_t using network endian/////将类型大小的数据转成网络字节数(大端)后放入缓冲区void appendInt64(int64_t x){int64_t be64 sockets::hostToNetwork64(x);append(be64, sizeof be64);}////// Append int32_t using network endian///void appendInt32(int32_t x){int32_t be32 sockets::hostToNetwork32(x);append(be32, sizeof be32);}void appendInt16(int16_t x){int16_t be16 sockets::hostToNetwork16(x);append(be16, sizeof be16);}void appendInt8(int8_t x){append(x, sizeof x);}////// Read int64_t from network endian////// Require: buf-readableBytes() sizeof(int32_t)//在缓冲区中读Intxx类型大小的数据,转换为主机字节序,并调整缓冲区的下标,然后返回数据int64_t readInt64(){int64_t result peekInt64();retrieveInt64();return result;}////// Read int32_t from network endian////// Require: buf-readableBytes() sizeof(int32_t)int32_t readInt32(){int32_t result peekInt32();retrieveInt32();return result;}int16_t readInt16(){int16_t result peekInt16();retrieveInt16();return result;}int8_t readInt8(){int8_t result peekInt8();retrieveInt8();return result;}////// Peek int64_t from network endian////// Require: buf-readableBytes() sizeof(int64_t)//在缓冲区中读Intxx类型大小的数据,转换为主机字节序,然后返回数据int64_t peekInt64() const{assert(readableBytes() sizeof(int64_t));int64_t be64 0;::memcpy(be64, peek(), sizeof be64);return sockets::networkToHost64(be64);}////// Peek int32_t from network endian////// Require: buf-readableBytes() sizeof(int32_t)int32_t peekInt32() const{assert(readableBytes() sizeof(int32_t));int32_t be32 0;::memcpy(be32, peek(), sizeof be32);return sockets::networkToHost32(be32);}int16_t peekInt16() const{assert(readableBytes() sizeof(int16_t));int16_t be16 0;::memcpy(be16, peek(), sizeof be16);return sockets::networkToHost16(be16);}int8_t peekInt8() const{assert(readableBytes() sizeof(int8_t));int8_t x *peek();return x;}////// Prepend int64_t using network endian/////转换为网络字节序,在缓冲区中读Intxx类型大小的数据,并调整缓冲区的下标,然后返回数据//将Intxx类型大小的数据转换为网络字节序,然后以前插的方式加入缓冲区void prependInt64(int64_t x){int64_t be64 sockets::hostToNetwork64(x);prepend(be64, sizeof be64);}////// Prepend int32_t using network endian///void prependInt32(int32_t x){int32_t be32 sockets::hostToNetwork32(x);prepend(be32, sizeof be32);}void prependInt16(int16_t x){int16_t be16 sockets::hostToNetwork16(x);prepend(be16, sizeof be16);}void prependInt8(int8_t x){prepend(x, sizeof x);}void prepend(const void* /*restrict*/ data, size_t len)//以前插的方式加入缓冲区,并调整下标{assert(len prependableBytes());readerIndex_ - len;const char* d static_castconst char*(data);std::copy(d, dlen, begin()readerIndex_);}//可以抽象理解为将buffer_修改为std::max(kInitialSize(1024),readableBytes()reserve)大小的空间void shrink(size_t reserve){// FIXME: use vector::shrink_to_fit() in C 11 if possible.Buffer other;other.ensureWritableBytes(readableBytes()reserve);//保证other拥有buffer_未读取数据的大小加上reserve预留空间大小的容量other.append(toStringPiece());//将buffer_的数据追加到otherswap(other);//调用swap与buffer_交换}size_t internalCapacity() const//返回vector实际占用的容量{return buffer_.capacity();}/// Read data directly into buffer.////// It may implement with readv(2)/// return result of read(2), c errno is savedssize_t readFd(int fd, int* savedErrno);private:char* begin(){ return *buffer_.begin(); }const char* begin() const{ return *buffer_.begin(); }void makeSpace(size_t len){// 可写空间 已读空间 除去缓冲区未读数据外的空间大小//len(需要的空间大小)kCheapPrepend(8字节预留内存)//小于则直接resize,大于则将数据移到前端if (writableBytes() prependableBytes() len kCheapPrepend)//{// FIXME: move readable databuffer_.resize(writerIndex_len);}else{// move readable data to the front, make space inside bufferassert(kCheapPrepend readerIndex_);size_t readable readableBytes();std::copy(begin()readerIndex_,//将可读数据移动到前端在缓冲区内部腾出空间begin()writerIndex_,begin()kCheapPrepend);readerIndex_ kCheapPrepend;writerIndex_ readerIndex_ readable;assert(readable readableBytes());}}private:std::vectorchar buffer_;size_t readerIndex_;size_t writerIndex_;static const char kCRLF[]; };} // namespace net } // namespace muduo#endif // MUDUO_NET_BUFFER_H buffer.cc // Copyright 2010, Shuo Chen. All rights reserved. // http://code.google.com/p/muduo/ // // Use of this source code is governed by a BSD-style license // that can be found in the License file.// Author: Shuo Chen (chenshuo at chenshuo dot com) //#include muduo/net/Buffer.h#include muduo/net/SocketsOps.h#include errno.h #include sys/uio.husing namespace muduo; using namespace muduo::net;const char Buffer::kCRLF[] \r\n;const size_t Buffer::kCheapPrepend; const size_t Buffer::kInitialSize;ssize_t Buffer::readFd(int fd, int* savedErrno) {// saved an ioctl()/FIONREAD call to tell how much to readchar extrabuf[65536];struct iovec vec[2];const size_t writable writableBytes();vec[0].iov_base begin()writerIndex_;vec[0].iov_len writable;vec[1].iov_base extrabuf;vec[1].iov_len sizeof extrabuf;// when there is enough space in this buffer, dont read into extrabuf.// when extrabuf is used, we read 128k-1 bytes at most.//1.如果buffer_::size大于extrabuf::size,那我们则只用buffer_存取数据//2.如果小于,则两块内存都使用,根据下标顺序先将数据写入buffer_,再将数据写入writable//在这个表达式下,一次性最多能读取的数据大小为writable65535,6553565536131071,也就是128k-1的大小,而一次性最少的空间为extrabuf(64k)buffer_(初始化最少空间为1k8byte)const int iovcnt (writable sizeof extrabuf) ? 2 : 1;const ssize_t n sockets::readv(fd, vec, iovcnt);if (n 0){*savedErrno errno;}//如果读取的数据小于writable,则直接更新buffer_下标就行了,//因为上述无论是第一种情况还是第二种情况,数据都是先写入buffer_else if (implicit_castsize_t(n) writable){writerIndex_ n;}//如果是第二种情况则直接把下标设置在末尾,然后调用append函数并将extrabuf的数据写入buffer_(内部会调整buffer_大小并追加数据)else{writerIndex_ buffer_.size();append(extrabuf, n - writable);}// if (n writable sizeof extrabuf)// {// goto line_30;// }return n; }
http://www.pierceye.com/news/180021/

相关文章:

  • 电子政务网站建设出版社百度网页提交入口
  • 专业柳州网站建设哪家便宜淄博桓台网站建设定制
  • 网站建设投标标书企业网站建设销售前景
  • wordpress建站教程凌风wordpress 仪表盘 慢
  • 怎样给网站或者商品做推广关于建网站新闻
  • 上海 微信网站 建站一对一直播app
  • ppt模板免费下载网站哪个好克拉玛依市住房和建设局网站
  • 制作网站得多少钱交互设计留学
  • 理财网站免费建设经典重庆新闻论坛
  • 南京专业网站制作哪家好企业所得税交多少
  • 广西网站建设哪家好常熟做网站的
  • 礼品网站制作辽宁省建设部网站
  • 网站群的建设目标澧县网页设计
  • 邯郸网站建设在哪里网站建设yingkagou
  • 姜堰区网站建设企业公司网站制作
  • 目前做的比较好的法律网站有哪些兰州seo技术优化排名公司
  • wordpress网站接入qqwordpress调用二级分类目录
  • 自建站有哪些站点soho 网站建设
  • cms网站建设如果在网上接网站建设项目
  • 建设网站的重点与难点在于社区网站模版
  • 自己在线制作logo免费网站公司网页设计教程
  • 广西城乡建设网站一家企业如何做网站推广
  • 小程序可以做网站吗wordpress 活动插件
  • 深圳网站建设流程图货代网站制作
  • 建设一个网站需要什么技术人员在线音乐网站开发
  • 做现货黄金看什么网站网络服务商怎么查询
  • 英语作文网站紫色个人网站模板
  • 视频直播网站开发 设计网站做的文字乱码
  • 江苏省建设执业中心网站wordpress婚礼模板下载
  • 互联网网站开发html5怎么做网站可以注册的