zoukankan      html  css  js  c++  java
  • 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 框架 详细看说明  ZYSocketFrame2TCPP2P说明.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)YSocketShareshareYNetBufferReadStream.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.       }  

    修复一个小问题:

    请将.YSocketFrame2北风之神SOCKET框架(ZYSocket)YSocketShareshareYNetBufferReadStreamV2.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

  • 相关阅读:
    java中的基本数据类型以及对应的包装类
    JQuery 基础
    题库一
    String、StringBuffer和StringBuilder的区别
    ideal控制台输出乱码
    python进阶
    python基础
    请求一个网页时,web服务做了什么?[以php为例]
    go defer看到你头晕的操作
    计算机基础-数据结构-栈
  • 原文地址:https://www.cnblogs.com/findumars/p/5176427.html
Copyright © 2011-2022 走看看