ZYSocket 4.3.5 SOCKET框架组 发布[NEW]

最新代码请到 github: https://github.com/luyikk/ZYSOCKET 更新

4.3.5更新说明:

修复各种BUG。 重写了一份 protobuf-net 有什么用呢,不需要添加 protobuf标签了。
值得注意的是 加了标签的类 里面的属性 都需要加,不加标签的 什么标签都不要加
注意已经删除了 Poienter 类 默认使用  默认使用 protobuf-net 格式化

 

CSDN:http://luyikk.download.csdn.net/

github: https://github.com/luyikk/ZYSOCKET

NUGET DLL:      PM> Install-Package ZYSOCKETDLL

NUGET Soruce:  PM> Install-Package ZYSOCKETSource

 


                                                                         byluyikk@126.com
                                                                         BLOG:http://blog.csdn.net/luyikk
                                                                         QQ:547386448

 

 

4.3更新说明:

使用了 ZYNetRingBufferPool 代替 ZYNetBufferReadStream
使用了 ZYNetRingBufferPoolV2 代替了 ZYNetBufferReadStreamV2

这2个类是 线程安全的,测试代码 里面有。这2个类基于环形数据缓冲的,你懂的。不懂百度吧~

ZySocketSuper 添加了 public BinaryInputOffsetHandler BinaryOffsetInput { get; set; }

你现在可以 使用偏移量 来把数据包输入到 缓冲池了。 对了 别忘了 把 IsOffsetInput 设置成true 详细看例1
这样做的好处是可以 少一次copy

ZYSocket.share.ReadBytes and ZYSocket.share.ReadBytesV2 添加了 直接读取函数 比如 int i=read.readInt32() 为了方便嘛


UDPService 嘛 目前测试阶段用的比较少。大家有空可以帮忙测测

 

对了 所有例子 我都改成了 RingBufferPool.

 

CSDN:http://luyikk.download.csdn.net/ 

github: https://github.com/luyikk/ZYSOCKET

NUGET DLL:      PM> Install-Package ZYSOCKETDLL

NUGET Soruce:  PM> Install-Package ZYSOCKETSource

 

                                                                         byluyikk@126.com
                                                                         BLOG:http://blog.csdn.net/luyikk
                                                                         QQ:547386448

 

4.2.3更新说明:

添加了.NET 4版本的 ZYSOCKETShare
.NET 4版本的 集成了 MsgPack 以及 Protobuf
例子请看 例子 7 例子8



.NET 4版本添加了 Socket RPC 
例子请看 例子 9
更相信的双工例子 请看 例子9- RPC 聊天室 双工


添加了 CmdToCallManager 用于处理 服务器多Cmd 自动指向函数 来代替 switch
详细请看 例子10 CmdToCall

 

 

CSDN: http://luyikk.download.csdn.net/  

NUGET: PM> Install-Package ZYSOCKETSourceAndExample

 

 

                                                                                                                                                                  by luyikk@126.com
                                                                                                                                                                  BLOG:http://blog.csdn.net/luyikk
                                                                                                                                                                  QQ:547386448

 

 

 

 

 

 

 

 

 

4.2.2 已经出了 修复了一些问题.

 完全支持MONO 平台.

 提供了安卓平台的MONO 版本 提供了 TCP P2P 安卓例子~

 服务器项目使用.NET 4了.其他的不变,比如CLIENTB 还是.NET 2.0 为了向下兼容嘛 

请大家到

CSDN: http://luyikk.download.csdn.net/  (安卓需独立下载)

NUGET: 搜索 ZYSOCKET  (有安卓版本)  CMD:PM> Install-Package ZYSOCKETSourceAndExample

 

 

 

                                                                                                                                                                  by luyikk@126.com
                                                                                                                                                                  BLOG:http://blog.csdn.net/luyikk
                                                                                                                                                                  QQ:547386448

 

 

 

 

//------------------------4.2.1-------------------------
1更新了点小BUG. 包括组包下 特别小的包的错误问题
2添加了 ZYSocketSSLClient 可以对 SSL 服务器的 访问
3例5
4MONO Server
5添加了 ZYSocketSSLClient 访问工行网站例子

 ZYSOCKET 4.2(v2) 下载地址:http://luyikk.download.csdn.net/

 

 

 

 

注意:如果服务时间长了发现 Handler 不下降 到达几万的时候服务器无法服务了。 那么

在服务器端这里加上这句话就可以了。

socketAsync.AcceptSocket.Close();

socketAsync.AccpetSocket.Dispose();

如果你发现你无法调用 Socket.Dispose() 那么 请使用 .NET 4.0

小知识:

那么Handler出现泄漏是怎么样的呢,一般在任务管理器看到 Handler出现上万了,导致服务器无法服务就是 Handler泄漏了那源代码 例1说吧一般服务需要 400多个 Handler,然后一个用户一个 socket对象 需要1个 Handler 如果 Handler数=用户连接数+450 左右 那么就是正常的,如果Handler数>用户连接数+450 已经出现了翻倍现象,那么就是不正常了

 

 

 

北风之神SOCKET框架组4.2(V2)发布:

 

//-------------------------4.2-------------------------
更新了一个 TCPP2P 框架 详细看说明  ZYSocketFrame2\TCPP2P\说明.txt

 

说明.txt:

P2PCLIENT  基本 DLL 
P2PSERVER P2P服务器,一般不需要咋改
P2PFileINFO 用次框架实现的 一款文件共享系统 一个测试程序
TestClientConsole 教你如何在你的项目中 使用 P2PCLIENT 一个测试程序

此P2P是基于 TCP的,能穿透大多数路由器

原理:  C 同时连接 对方的 连接出的端口号 S 用于同步 C 
可做项目: 想的到就做的到,比如能做个 在家就能直接访问公司电脑的一款程序,服务器文件同步程序等


P2PSERVER P2P服务器 架设方法:
首先在服务器上 部署 P2PSERVER. Config 文件基本不用修改  当然你也根据需要修改
MServerPort 为主服务端口
RegServerPort 为副端口
MaxConCount 为连接最大数
ServerIP 为服务IP

 

P2PFileINFO 架设方法:
修改Config文件
ServerIP 为P2P服务器IP 
ServerPort 为服务器端口 对于上面的 MServerPort
ServerRegPort 为服务器符端口 对于上面的 RegServerPort
MinPort 和 MaxPort 为端口号范围 一般不用改
ResCount 为 连接次数

ConnentKey 为访问密码
SharePath 为 共享目录

 

TestClientConsole CONFIG:
ServerIP 为P2P服务器IP 
ServerPort 为服务器端口 对于上面的 MServerPort
ServerRegPort 为服务器符端口 对于上面的 RegServerPort
MinPort 和 MaxPort 为端口号范围 一般不用改
ResCount 为 连接次数

 

 

 

                                                                                                                                                                  by luyikk@126.com
                                                                                                                                                                  BLOG:http://blog.csdn.net/luyikk
                                                                                                                                                                  QQ:547386448

 

 ZYSOCKET 4.2(v2) 下载地址:http://luyikk.download.csdn.net/

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

北风之神SOCKET框架组4.1(V2)发布:


1.使用sharpSerializerSolution 序列化,反序列化,提高了性能,(感谢麦上飞提供)

注意此组件只能序列化有 无参构造函数的类。所以多使用自定义类!!像DataSet DataTable会失败,如果你想序列化这些,请把序列化代码改回去吧。它们在 BufferFormat.cs 和 ReadBytes.cs 里面 很容易找到


2.修复了一些已知的BUG。

                                                                                                                      byluyikk@126.com
                                                                                                                      BLOG:http://blog.csdn.net/luyikk
                                                                                                                     QQ:547386448

 

ZYSOCKET 4.1(v2) 下载地址: http://luyikk.download.csdn.net/

 


 第2次修复一个BUG:

ZYSocketFrame2\北风之神SOCKET框架(ZYSocket)\ZYSocketShare\share\ZYNetBufferReadStream.cs

 

请将Flush方法修改为:

 

 

[csharp] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. public override void Flush()  
  2.       {  
  3.           _capacity = MaxSize;  
  4.           Datas = new byte[_capacity];  
  5.           _length = 0;  
  6.           _canRead = true;  
  7.           _canWrile = true;             
  8.           _headlengt = -1;  
  9.           _position = 0;  
  10.           _pw = 0;  
  11.       }  

 

 

 

 

修复一个小问题:

请将.\ZYSocketFrame2\北风之神SOCKET框架(ZYSocket)\ZYSocketShare\share\ZYNetBufferReadStreamV2.cs  CheckHeadLengt()方法修改为:

 

 

[csharp] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. protected override void CheckHeadLengt()  
  2.        {  
  3.            if (_headlengt == -1)  
  4.            {  
  5.                //int num = (_length - _pw);  
  6.                //if (HeadBit > num)  
  7.                //{  
  8.                //    return;  
  9.                //}  
  10.   
  11.            re:  
  12.   
  13.                while (Datas[_pw] != 0xFF)  
  14.                {  
  15.                    if (_pw < _length-1)  
  16.                        _pw++;  
  17.                    else  
  18.                        return;  
  19.                }  
  20.   
  21.                _pw++;  
  22.   
  23.                if (_pw >= _position-1)  
  24.                    return;  
  25.   
  26.                byte lengt;  
  27.                uint res;  
  28.                if (!ReadUInt32(out res, out lengt))  
  29.                    return;  
  30.   
  31.                 
  32.   
  33.                if (res > 0)  
  34.                {  
  35.   
  36.                    if (res > MaxSize)  
  37.                    {  
  38.                        this._headlengt = -1;  
  39.                         RestPostion();  
  40.                        return;  
  41.                    }  
  42.   
  43.                    this._headlengt = (int)res;  
  44.   
  45.                }  
  46.                else  
  47.                {  
  48.                    _pw += lengt;  
  49.   
  50.                    goto re;  
  51.                }  
  52.            }  
  53.        }  


 

 

 

 

 

北风之神SOCKET框架组4.0(V2)发布:

 

1.添加了一组新的数据包处理类
ZYSocketShare.share.ZYNetBufferReadStream //此类可代替  ZYSocketShare.share.BuffList
ZYSocketShare.share.ZYNetBufferReadStreamV2  //此类是 ZYSocketShare.share.ZYNetBufferReadStream 的改进版,优化了int存储方式,数据包容错率等
ZYSocketShare.share.BufferFormatV2 //此类是 ZYSocketShare.share.BufferFormat 的改进版,优化了int存储方式等
ZYSocketShare.share.ReadBytesV2 //此类是 ZYSocketShare.share.ReadBytes 的改进版,优化了int存储方式等

注意 如果需要更换为V2数据包处理框架,那么请确保 使用ZYNetBufferReadStreamV2  BufferFormatV2 ReadBytesV2  保持一致的应用。

添加了案例
1. 例1(V2) 例1的V2例子
2. 例4(FileIO) 一款使用 V2 数据包处理架构 制作的一个远程文件系统管理程序 注意:初学者请勿轻易修改任何代码,否则可能会影响测试效果


                                                                                  byluyikk@126.com
                                                                                  BLOG:http://blog.csdn.net/luyikk
                                                                                  QQ:547386448

 

 ZYSOCKET 4.0(v2) 下载地址: http://luyikk.download.csdn.net/

 

北风之神SOCKET框架组3.2发布:

 

 

 

修改了 ReadObject方法,经过测试.出于性能的考虑和使用的方便 内部采用了DataContractSerializer  序列化.
bool ReadObject(out object obj) 变成了bool ReadObject<T>(out T obj);
继承与FormatClassAttibutes的数据包类不需要[Serializable]标签了.

修改了服务器端 ZYSocketSuper 类.
ZYSocketSuper 的构造方法 里面传入IP地址和端口,一直存在错误.我最近才发觉.抱歉各位


删除了 例4 代码. 因为我觉得 这简直就是误导人.

代码在数据包缓存还不是很完美,特别是处理大型连续分段数据包上.还有待改进.简单的改进理论是使用NetWorkStream 来代替现有的数据包缓冲区.由于没时间,这部分交给大家自己研究吧,但是如果不传文件.那已经基本上都够用了.更何况传文件还有其他的方法.

 

本打算写一份基于OOP概念的框架模型.但是时间太紧了.最近一直在搞C++ 一直没如愿以偿.
感谢 麦上飞 提供技术支持. Sorry!!

 

                                                                                   byluyikk@126.com
                                                                                   BLOG:http://blog.csdn.net/luyikk
                                                                                  QQ:547386448

 

ZYSOCKET 3.2 下载地址: http://luyikk.download.csdn.net/ 

 

 

//----------------------------------以下3.1更新内容-----------------------------------

感谢大家对北风之神SOCKET框架的支持。鼓励。下面是北风之神 3.1的更新内容:

 

修正BUG:
 1.ZYSocketSuper 读取 配置文件的最大连接数 读错问题。
 2.ZYSocketSuper 无法断开客户端的问题。
 3.BuffList 数据包解析丢失问题。
 4.例1,例2.客户端断开忘记释放调用SOCKET.CLOSE()的问题

 

 

新增功能
 1.添加了一个ReadBytes 构造函数,此函数实现了在数据包在读取前需要回调的方法传入。(可以用来解密,解压缩 等功能)
 2.添加了一个BufferFormat 类的构造,此函数实现了在数据包在生成前需要回调的方法传入。(可以用来加密,压缩 等功能)
 3.添加了BufferFormat.FormatFCA(object o,FDataExtraHandle dataExtra)静态方法。可以用来在类格式化成数据包的时候进行加

 

 

密压缩等功能
 4.添加了ZYSocket.Security 命名空间,里面有传统的AES,DES算法的加解密类
 5.添加了ZYSocket.Compression命名空间,里面有通过Deflate算法压缩类
 6.开发了ReadBytes.Data属性,为ReadBytes里面的BYTE[]对象。值得注意的是 ReadBytes.Length为数据包原始长度,如果要得到解压缩后的数据包长度,请访问ReadByte.Data.length

 

 

 

新增代码
 加解密实例测试 项目:演示了 AES DES 以及Deflate 的使用方法。
 例3 - 例2的加密版 项目:就是讲例2通过DES 加密进行通讯的例子
 连接测试工具 项目:很多朋友问我要连接数量测试工具。我一起的真的丢了。找不到了。所以重新写了一个
 例4 项目:好多人让我写一个发送文件的例子,现在能如愿以偿了

 

 

 

 

                                               by luyikk@126.com
                                               BLOG:http://blog.csdn.net/luyikk
                                               QQ:547386448

 

 

 

 

 

 

 

 

ZYSOCKET 3.1 下载地址: http://luyikk.download.csdn.net/ 

 

 

 

 

 

 

 

 

 

 

//-----------------------------------------以下为3.0发布内容--------------------------------

 

北风之神SOCKET框架组3.0说明:

 

北风之神框架(ZYSOCKETSUPTER) 从1.0开始 就以超强的性能 得到了大家的支持;

 

北风之神 主要更新以下内容:

1. 一个基于 SocketAsyncEventArgs 的客户端 (ZYSocketClientA.dll)ZYSocket.ClientA.SocketClient

它支持.net 3.0以上版本,还适用于silverlight

性能非常优异,代码量小;

2. 一个数据包缓冲类 ZYSocketShare.dll (ZYSocket.share.BuffList)

BuffList是个性能优秀,线程安全的,数据包缓冲类。而且使用起来实在太方便了。

3.一个数据包格式化类 ZYSocketShare.dll (ZYSocket.share.BufferFormat)

BufferFormat 是个性能优异 功能强大的类,主要功能是讲各种.NET数据结构的数据转换为数据包。

支持对自定义类对象转换。

4.一个.net数据结构格式化类 ZYSocketShare.dll (ZYSocket.share.ReadBytes)

它和BufferFormat 是对应关系,通过这个类你可以轻易将数据包转换成.NET 数据结构,性能优越,功能强大,并可以直接讲数据包转换为对象。

5.FormatClassAttibutes标签。ZYSocketShare.dll(ZYSocket.share.FormatClassAttibutes)

凡是打了此标签的类,并打了Serializable,就刻个通过上面的2个类直接讲对象转换成数据包通过SOCKET发送。FormatClassAttibutes的功能就是用来设置此类的数据包命令的

6.ZySocketSupter 更新:

优化了代码,并更新了对域名支持,以及从配置文件中读取服务配置

 

本包中包含2个例子

2个例子都有代码注释 总实现代码不超过 100行

第一个是 讲解 控制台程序 使用本框架

第二个是 讲解 WINFROM程序 使用本框架

 

 

一下是面向对象数据包的部分代码

 

 

[c-sharp] view plain copy
 
 print?
  1. //定义通讯的数据包类  
  2. using System;  
  3. using System.Collections.Generic;  
  4. using System.Linq;  
  5. using System.Text;  
  6. using ZYSocket.share;  
  7. namespace BuffLibrary  
  8. {  
  9.     /// <summary>  
  10.     /// 用于发送消息  
  11.     /// </summary>  
  12.     [Serializable]  
  13.     [FormatClassAttibutes(500)]  
  14.     public class Message  
  15.     {  
  16.         /// <summary>  
  17.         /// 消息类型,1 登入失败,2登入成功..其他 未定义  
  18.         /// </summary>  
  19.         public int Type { get; set; }  
  20.         /// <summary>  
  21.         /// 消息字符串  
  22.         /// </summary>  
  23.         public string MessageStr { get; set; }  
  24.     }  
  25.       
  26.     /// <summary>  
  27.     /// 登入数据包  
  28.     /// </summary>  
  29.     [Serializable]  
  30.     [FormatClassAttibutes(1000)]  
  31.     public class Login  
  32.     {  
  33.         /// <summary>  
  34.         /// 用户名  
  35.         /// </summary>  
  36.         public string UserName { get; set; }  
  37.         /// <summary>  
  38.         /// 密码  
  39.         /// </summary>  
  40.         public string PassWord { get; set; }  
  41.     }  
  42.   
  43.     /// <summary>  
  44.     /// PING 数据包  
  45.     /// </summary>  
  46.     [Serializable]  
  47.     [FormatClassAttibutes(800)]  
  48.     public class Ping  
  49.     {  
  50.         /// <summary>  
  51.         /// 发送的时候记录的时间  
  52.         /// </summary>  
  53.         public DateTime UserSendTime { get; set; }  
  54.         /// <summary>  
  55.         /// 服务器接受记录的时间  
  56.         /// </summary>  
  57.         public DateTime ServerReviceTime { get; set; }  
  58.     }  
  59.   
  60.     /// <summary>  
  61.     /// 读取DATASET请求  
  62.     /// </summary>  
  63.     [Serializable]  
  64.     [FormatClassAttibutes(1002)]  
  65.     public class ReadDataSet  
  66.     {  
  67.         public string TableName { get; set; }  
  68.         public System.Data.DataSet Data { get; set; }  
  69.     }  
  70.   
  71.   
  72. }  

 

 

 

 

[c-sharp] view plain copy
 
 print?
  1. //使用自己定义的数据包类通讯  
  2.   
  3.    void client_DataOn(byte[] Data)  
  4.         {  
  5.             ReadBytes read = new ReadBytes(Data);  
  6.   
  7.             int length;  
  8.             int cmd;  
  9.   
  10.             if (read.ReadInt32(out length) && read.ReadInt32(out cmd) && length == read.Length)  
  11.             {  
  12.                 switch (cmd)  
  13.                 {  
  14.                     case 800: //PING命令  
  15.                         {  
  16.                             object pingo;  
  17.                             if (read.ReadObject(out pingo))  
  18.                             {  
  19.                                 Ping p = pingo as Ping;  
  20.   
  21.                                 if(p!=null)  
  22.                                 this.BeginInvoke(new EventHandler((o, x) =>  
  23.                                     {  
  24.                                         Ping nn = o as Ping;  
  25.   
  26.                                         if (nn != null)  
  27.                                         {  
  28.                                             toolStripStatusLabel1.Text = string.Format("Ping:{0} ({1})", //计算并显示PING  
  29.                                                 (DateTime.Now - nn.UserSendTime).Milliseconds,  
  30.                                                 (DateTime.Now - nn.ServerReviceTime).Milliseconds);  
  31.                                         }  
  32.                                     }),p);  
  33.                             }  
  34.                         }  
  35.                         break;  
  36.                     case 1002:  
  37.                         object dataseto;  
  38.                         if (read.ReadObject(out dataseto)) //获取服务器发送过来的 DATASET   
  39.                         {  
  40.                             ReadDataSet dox=dataseto as ReadDataSet;  
  41.                             if (dox != null)  
  42.                             {  
  43.                                 this.BeginInvoke(new EventHandler((o, x) =>  
  44.                                 {  
  45.                                     ReadDataSet nn = o as ReadDataSet;  
  46.   
  47.                                     if (nn != null)  
  48.                                     {  
  49.                                           
  50.                                         this.dataGridView1.DataSource = nn.Data.Tables[nn.TableName]; //绑定到视图  
  51.                                         this.dataGridView1.Update();  
  52.                                     }  
  53.                                 }), dox);  
  54.                             }  
  55.                         }  
  56.                         break;  
  57.   
  58.                 }  
  59.             }  
  60.   
  61.         }  

 

 

 

 

这2段代码只是部分代码,

 

3.0 下载地址

 

http://download.csdn.net/source/2939736

 

 

至于为什么要叫北风之神呢?

因为 最近特别冷,温度突然降低16度,冻死我了。北风吹的我都块痉挛了。 我对着天空喊 北风之神 刮慢点吧。

正因为这个代码这这样的环境下写的,所以 叫做北风之神

 

 

 

 

#region  补丁:

 修正 BuffList 类丢失数据包问题! 

 

 

 

[c-sharp] view plain copy
 
 print?
  1. /* 
  2.  * 北风之神SOCKET框架(ZYSocket) 
  3.  *  Borey Socket Frame(ZYSocket) 
  4.  *  by luyikk@126.com 
  5.  *  Updated 2011-1-20  
  6.  */  
  7. using System;  
  8. using System.Collections.Generic;  
  9. using System.Text;  
  10. using System.Threading;  
  11. using System.IO;  
  12.   
  13. namespace ZYSocket.share  
  14. {  
  15.     /// <summary>  
  16.     /// 数据包组合类  
  17.     /// 功能描述:保持数据包完整性。  
  18.     /// (通过互联网发送数据包,实际上是将一个较大的包拆分成诺干小包,此类的功能就是讲诺干小包重新组合成完整的数据包)  
  19.     /// 此类是线程安全的  
  20.     /// </summary>  
  21.     public class BuffList  
  22.     {  
  23.         public object locklist = new object();  
  24.   
  25.         /// <summary>  
  26.         /// 数据包列表  
  27.         /// </summary>  
  28.         public List<byte> ByteList { get; set; }  
  29.   
  30.         private int current;  
  31.   
  32.         private int lengt;  
  33.   
  34.         private int Vlent;  
  35.   
  36.         /// <summary>  
  37.         /// 数据包有可能出现的最大长度。如果不想服务器被人攻击到内存崩溃请按实际情况设置  
  38.         /// </summary>  
  39.         public int MaxSize { get; set; }  
  40.   
  41.         /// <summary>  
  42.         /// 数据包组合类  
  43.         /// </summary>  
  44.         /// <param name="maxSize">数据包有可能出现的最大长度。如果不想服务器被人攻击到内存崩溃请按实际情况设置</param>  
  45.         public BuffList(int maxSize)  
  46.         {  
  47.             MaxSize=maxSize;  
  48.             lengt = -1;  
  49.             Vlent = 0;  
  50.             ByteList = new List<byte>();  
  51.              
  52.         }  
  53.   
  54.         public void Reset()  
  55.         {  
  56.             Interlocked.Exchange(ref lengt, -1);  
  57.             Interlocked.Exchange(ref Vlent, 0);  
  58.             Interlocked.Exchange(ref current,0);  
  59.             ByteList.Clear();  
  60.               
  61.         }  
  62.   
  63.          
  64.   
  65.         public bool InsertByteArray(byte[] Data,int ml,out List<byte[]> datax)  
  66.         {  
  67.             lock(locklist)  
  68.             {  
  69.                 datax = new List<byte[]>();  
  70.                                 
  71.                 ByteList.AddRange(Data);  
  72.   
  73.                 Interlocked.Add(ref Vlent, Data.Length);  
  74.   
  75.                   
  76.                 if (lengt == -1 && Vlent > ml)  
  77.                 {  
  78.                     int res = 0;  
  79.   
  80.                     for (int i = 0; i < ml; i++)  
  81.                     {  
  82.                         int temp = ((int)ByteList[current+i]) & 0xff;  
  83.                         temp <<= i * 8;  
  84.                         res = temp + res;  
  85.                     }  
  86.   
  87.                     if (res > MaxSize)  
  88.                     {  
  89.                         Reset();  
  90.                         throw new Exception("数据包大于预设长度,如果你传入的数据比较大,请设置重新 maxSize 值");  
  91.                     }  
  92.   
  93.                     if (res <= 0)  
  94.                     {  
  95.                         Reset();  
  96.                          
  97.                         return false;  
  98.                     }  
  99.                       
  100.                     Interlocked.Exchange(ref lengt,res);  
  101.                 }  
  102.   
  103.   
  104.                 if ((Vlent - current) >= lengt)  
  105.                 {  
  106.   
  107.                     int lengx = lengt;  
  108.                     Interlocked.Exchange(ref lengt, -1);  
  109.   
  110.                     byte[] data = new byte[lengx];  
  111.                     ByteList.CopyTo(current, data, 0, lengx);  
  112.                     datax.Add(data);  
  113.   
  114.                     Interlocked.Add(ref current, lengx);  
  115.   
  116.   
  117.                 recopy:  
  118.   
  119.                     if (current == ByteList.Count)  
  120.                     {  
  121.                         Reset();  
  122.                         return true;  
  123.                     }  
  124.                  
  125.                     if (ByteList.Count - current > ml)  
  126.                     {  
  127.                         int res = 0;  
  128.                         for (int i = 0; i < ml; i++)  
  129.                         {  
  130.                             int temp = ((int)ByteList[current + i]) & 0xff;  
  131.                             temp <<= i * 8;  
  132.                             res = temp + res;  
  133.                         }  
  134.   
  135.                         if (res > MaxSize)  
  136.                         {  
  137.                             Reset();  
  138.                             throw new Exception("数据包大于预设长度,如果你传入的数据比较大,请设置重新 maxSize 值");  
  139.                         }  
  140.   
  141.                         if (res <= 0)  
  142.                         {  
  143.                             Reset();  
  144.                             return true;  
  145.                         }  
  146.   
  147.                         if (ByteList.Count - current < res)  
  148.                         {  
  149.                             return true;  
  150.                         }  
  151.                         data = new byte[res];  
  152.                         ByteList.CopyTo(current, data, 0, res);  
  153.                         datax.Add(data);  
  154.   
  155.                         Interlocked.Add(ref current, res);  
  156.   
  157.                         goto recopy;  
  158.                     }  
  159.   
  160.                     return true;  
  161.                 }  
  162.                 else  
  163.                 {  
  164.                     return false;  
  165.                 }  
  166.             }            
  167.               
  168.         }   
  169.   
  170.     }  
  171. }  

 

 

 

修正后的 BuffList类 所需的调用修改:

 

 

[c-sharp] view plain copy
 
 print?
  1. //BuffList 数据包组合类 如果不想丢数据就用这个类吧  
  2. BuffList buff = socketAsync.UserToken as BuffList;   
  3.   
  4. List<byte[]> datax;  
  5.   
  6. if (buff.InsertByteArray(data, 4,out datax)) //强力插入数据包,如果数据包组合成功返回TURE 并输出数据包  
  7. {  
  8.     if (datax != null)  
  9.     {  
  10.         foreach (byte[] p in datax)  
  11.         {  
  12.             DataOn(p, socketAsync);  
  13.   
  14.         }  
  15.   
  16.     }  
  17. }  

#endregion

 

http://blog.csdn.net/luyikk/article/details/6099337

 

posted @ 2016-02-01 22:12  findumars  Views(750)  Comments(0Edit  收藏  举报