网络收发之cycleBuf

  1 #pragma once
  2
  3 #include <iostream>
  4 #include <string>
  5
  6 class cyclebuffer
  7 {
  8 protected:
  9     volatile int32_t  m_nReadIndex;
 10     volatile int32_t  m_nWriteIndex;
 11     volatile int32_t  m_nDataSize;  //有效数据大小
 12     volatile int32_t  m_nBufSize;   //总buf大小
 13     uint_8            *m_pBuf;
 14
 15 public:
 16     //剩余空间数
 17     int32_t Space()
 18     {
 19         return m_nBufSize-m_nDataSize;
 20     }
 21
 22     //获取buf的总大小
 23     int32_t  Capatity()
 24     {
 25         return m_nBufSize;
 26     }
 27
 28     //获取有效数据长度
 29     int32_t Size()
 30     {
 31         return m_nDataSize;
 32     }
 33     //清空
 34     void Reset()
 35     {
 36         m_nReadIndex = 0;
 37         m_nwriteIndex = 0;
 38         m_nDataSize   = 0;
 39     }
 40
 41     //增加nSize个字节
 42     int32_t  Grow(int32_t nSize)
 43     {
 44
 45     }
 46
 47     //写到写列表的头部---针对新数据
 48     int32_t WriteToHead(const uint8_t *pBuf, int32_t nDataSize)
 49     {
 50         if(nDataSize < 0 || pBuf == NULL)
 51         {
 52             return 0;
 53         }
 54
 55         //空间不够
 56         if(m_nDataSize + nDataSize > m_nBufsize)
 57         {
 58             if(Grow((m_nDataSize+nDataSize) - m_nDataSize) <= 0)
 59             {
 60                 return 0;
 61             }
 62         }
 63
 64         if(m_nWriteIndex < m_nReadIndex)
 65         {
 66             memcpy(&m_pBuf[m_nReadIndex-nDataSize], pBuf, nDataSize);
 67             m_nReadIndex -= nDataSize;
 68         }
 69         else if(m_nWriteIndex == m_nReadIndex)
 70         {
 71             return Write(pBuf, nDataSize);
 72         }
 73         else
 74         {
 75             int32_t nLeftDataSize = (nDataSize-m_nReadIndex<0)?nDataSize:m_nReadIndex;
 76             if(nLeftDataSize < nDataSize)   //此时nLeftDataSize == m_nReadIndex,m_nReadIndex前面的空间不够
 77             {
 78                 int32_t nTailDataSize = nDataSize - nLeftDataSize;
 79                 int32_t nWriteIndex   = m_nBufSize - nTailDatasize;
 80                 memcpy(&m_pBuf[nWriteIndex], pBuf, nDataSize-nLeftDataSize);  //从内存最后向前写
 81                 memcpy(&m_pBuf[0], pBuf+nTailDataSize, nLeftDataSize);
 82                 m_nReadIndex = nWriteIndex;
 83             }
 84             else
 85             {
 86                 if(m_nReadIndex-nDataSize < 0)
 87                 {
 88                     return 0;
 89                 }
 90                 memcpy(&m_pBuf[m_nReadIndex-nDataSize], pBuf, nDataSize);
 91                 m_nReadIndex -= nDataSize;
 92             }
 93         }
 94         m_nDataSize += nDataSize;
 95         return nDataSize;
 96     }
 97
 98     //写到列表的尾部
 99     int32_t Write(const uint8_t *pBuf, int32_t nDataSize)
100     {
101         if(nDataSize <= 0 || NULL == pBuf)
102         {
103             return 0;
104         }
105
106         if(nDataSize + m_nDataSize > m_nBufSize)
107         {
108             if(Grow((nDataSize+nBufSize)-m_nDataSize) <= 0)
109             {
110                 return 0;
111             }
112         }
113
114         if(m_nWriteIndex < m_nReadIndex)
115         {
116             memcpy(&m_pBuf[m_nWriteIndex], pBuf, nDataSize);
117             m_nWriteIndex += nDataSize;
118         }
119         else
120         {
121             int32_t nLeftDataSize = m_nBufSize - m_nWriteIndex;
122             if(nLeftDataSize < nDataSize)
123             {
124         {
125                 memcpy(&m_pBuf[m_nWriteIndex], pBuf, nLeftDataSize);
126                 memcpy(&m_pBuf[0], pBuf+nLeftDataSize, nDataSize-nLeftDataSize);
127                 m_nwriteIndex = nDataSize - nLeftDataSize;
128             }
129             else
130             {
131                 memcpy(&m_pBuf[m_nWriteIndex], pBuf, nDataSize);
132                 m_nWriteIndex += nDataSize;
133             }
134         }
135         m_nDataSize += nDataSize;
136         return nDataSize;
137     }
138
139     //读取 读列表的头部内存
140     int32_t Read(uint8_t *pBuf, const int32_t nWantSize)
141     {
142         if(nWantSize <= 0 || NULL == pBuf)
143         {
144             return 0;
145         }
146
147         int32_t nDataSize = ((m_nDataSize < nWantSize)?m_nDataSize : nWantSize);
148         if(nDataSize<=0)
149         {
150             return 0;
151         }
152        if(m_nReadIndex < m_nWriteIndex)
153         {
154             memcpy(pBuf, &m_pBuf[m_nReadIndex], nDataSize);
155             m_nReadIndex += nDataSize;
156         }
157         else
158         {
159             int32_t nLeftDataSize = m_nBufSize - m_nReadIndex;
160             if(nLeftDataSize < nDataSize)
161             {
162                 memcpy(pBuf, &m_pBuf[m_nReadIndex], nLeftDataSize);
163                 memcpy(pBuf+nLeftDataSize, &m_pBuf[0], nDataSize-nLeftDataSize);
164                 m_nReadIndex = nDataSize-nLeftDataSize;
165             }
166             else
167             {
168                 memcpy(pBuf, &m_pBuf[m_nReadIndex], nDataSize);
169                 m_nReadIndex += nDataSize;
170             }
171         }
172         m_nDataSize -= nDataSize;
173         return nDataSize;
174     }
175
176
177     //读取数据但是不修改读索引
178     int32_t  PeekRead(uint8_t *pBuf, const int32_t nWantSize)
179     {
180         if(nWantSize <= 0 || pBuf == NULL)
181         {
182             return 0;
183    }
184
185         int32_t  nDataSize = ((m_nDataSize < nWantSize) ? m_nDataSize : nWantSize);
186         if(m_nReadIndex < m_nWriteIndex)
187         {
188             memcpy(pBuf, &m_pBuf[m_nReadIndex], nDataSize);
189         }
190         else if(m_nReadIndex == m_nWriteIndex)
191         {
192             return 0;
193         }
194         else
195         {
196             int32_t nLeftDataSize = m_nBufSize - m_nReadIndex;
197             if(nLeftDataSize < nDataSize)
198             {
199                 memcpy(pBuf, &m_pBuf[m_nReadIndex], nLeftDataSize);
200                 memcpy(pBuf+nLeftDataSize, &m_pBuf[0], nDataSize-nLeftDataSize);
201             }
202             else
203             {
204                 memcpy(pBuf, &m_pBuf[m_nReadIndex], nDataSize);
205             }
206         }
207         return  nDataSize;
208     }
209
210 };

网络收发之cycleBuf

时间: 2024-10-09 04:41:22

网络收发之cycleBuf的相关文章

Qt网络开发之QNetworkAccessManager 及 qt4使用QUdpSocket发送数据报datagrams

一:Qt网络开发之QNetworkAccessManager  (http://m.blog.csdn.net/blog/u010002704/41355917) 一个应用程序,一个QNetworkAccessManager就足够了 每一个回复QNetworkReply都需要删除,否则会出现内存泄露,根据Qt的帮助文档,在接收完数据的槽中使用deleteLater(),防止内存泄露. 二:Qt4使用QUdpSocket发送数据报datagrams UDP服户端绑定广播[喝小酒的网摘]http:/

Android网络开发之用tcpdump抓包

Android开发过程中,当涉及到网络通信的时候,有一些字段需要抓包获取.我之前因为SSDP设备发现的包头格式没有写对,经过抓包分析和标准包头对比发现了这个困扰我很久的问题.总之,掌握在Android手机里面抓包是很有必要的. 准备工作:Android系统的手机,网络环境,tcpdump,破解手机root权限,建议最好在手机里面安装RE文件管理器并且给root权限.具体步骤如下: 首先,通过adb工具将tcpdump推送到手机,tcpdump的下载地址为:http://www.strazzere

iOS网络开发之AFNetworking

概述 AFNetworking是一个非常受欢迎的轻量级的iOS.Mac OS X网络通信类库.它建立在NSURLConnection.NSOperation以及其技术的基础上,有着精心设计的模块结构和功能丰富的API,让很多网络通信功能的实现变得十分简单. AFNetworking支持HTTP请求和基于REST的网络服务(包括GET.POST. PUT以及DELETE等).支持ARC.AFNetworking项目中还包含一些列单元测试. 要求iOS 5.0及以上版本,或者Mac OS 10.7及

Swift网络开发之NSURLSession学习笔记

先上效果图:        功能: -单个任务下载 -暂停下载任务 -取消下载任务 -断点下载 -显示下载进度及速度 -多任务下载 -分别控制各个任务 在如今移动互联网的浪潮中,手机APP越来越依赖网络通讯来交互数据.今天我们就来分享下如何通过使用NSURLSession这个Apple官方提供的网络接口实现文件下载的思路. NSURLSsession 先来介绍下NSURLSession这个接口.NSURLSession是苹果在WWDC2013上推出的用于替代它的前辈NSURLConnection

Android网络开发之OkHttp--基本用法实例化各个对象

1.实例化OkHttpClient对象,OkHttpClient包含了以下属性,以及set()和get()方法.但并没有包含具体的执行方法,详情见源码. //实例化OkHttpClent对象 private OkHttpClient client = new OkHttpClient(); private static SSLSocketFactory defaultSslSocketFactory; private final RouteDatabase routeDatabase; priv

Android网络开发之OkHttp--基本用法POST

1.OkHttp框架使用了OkIo框架,不要忘记下OkIo.jar 2.通过POST访问网络,和通过GET访问网络基本相同,多了设置请求参数的过程.主要分为五步: (1).声明并实例化一个OkHttpClient对象 (2).声明并实例化一个RequestBody对象 (3).声明并实例化一个Request对象 (4).执行Request请求,并得到一个Response对象 (5).根据Response的isSuccessful()方法判断是否成功,然后从Response对象中获取返回数据. 3

Android网络开发之OkHttp--基本用法GET

1.OkHttp框架使用了OkIo框架,不要忘记下OkIo.jar 2.通过同步GET访问网络,主要分为四步: (1).声明并实例化一个OkHttpClient对象. (2).声明并实例化一个Request对象,并设置URL等参数. (3).执行Request请求,并获得一个Response对象. (4).根据Response的isSuccessful()方法,判断是否成功,然后从Response对象中获取返回数据. 3.通过异步GET访问网络和同步GET是一样的,不过处理返回数据实在CallB

Android网络开发之Volley--Volley基本用法(三)

1.ImageRequest用法和StringRequest一样,主要分为3步: (1).实例化一个RequestQueue对象 (2).设置ImageRequest对象参数,并将ImageRequest对象加入RequestQueue队列 (3).执行start()方法 2.ImageLoader用法 (1).实例化一个RequestQueue对象 (2).实例化一个ImageLoader对象 (3).实例化一个ImageListener对象 (4).执行ImageLoader对象的get()

Android网络开发之Volley--Volley基本用法(一)

1.StringRequest用法 主要分为3步: (1).实例化一个RequestQueue对象 (2).设置StringRequest对象参数,并将StringRequest对象加入RequestQueue队列 (3).执行start()方法 public class StringActivity extends Activity { private TextView mTvShow; private RequestQueue requestQueue; @Override protecte