/// <summary>/// 清空粘包缓存区 /// </summary> /// <param name="con"></param> private void ClearBag(int conn) { try { DynamicBufferManager outbag = null; switch (conn % workQueueCount) { case 0: dicBufferDic1.TryRemove(conn, out outbag); break; case 1: dicBufferDic2.TryRemove(conn, out outbag); break; case 2: dicBufferDic3.TryRemove(conn, out outbag); break; case 3: dicBufferDic4.TryRemove(conn, out outbag); break; case 4: dicBufferDic5.TryRemove(conn, out outbag); break; case 5: dicBufferDic6.TryRemove(conn, out outbag); break; case 6: dicBufferDic7.TryRemove(conn, out outbag); break; case 7: dicBufferDic8.TryRemove(conn, out outbag); break; default: dicBufferDic1.TryRemove(conn, out outbag); break; } } catch (Exception exBag) { Console.WriteLine("情况粘包区异常:" + exBag.Message.ToString()); } }
/// <summary> /// 处理粘包信息 /// </summary> /// <param name="socket">发送时即将传递的Socket</param> /// <param name="byteRecive">接收的字节流</param> /// <param name="dicBufferIndex">粘包的缓存区索引(目前使用终结点)</param> /// <param name="dicBufferDic">句柄所在数据群</param> /// <returns>一个或者多个完整的数据包集合</returns> public static List <byte[]> MakeStickingBag(byte[] byteRecive, int dicBufferIndex, ConcurrentDictionary <int, DynamicBufferManager> dicBufferDic) { //var complete = new List<byte[]>();//存放完整的数据包 var completeByteArrList = new List <byte[]>(); try { // var byteRecive = reciveByteArr; //判断粘包缓存区是否存在数据 if (dicBufferDic.ContainsKey(dicBufferIndex)) { dicBufferDic[dicBufferIndex].WriteBuffer(byteRecive); var tempByteArr = dicBufferDic[dicBufferIndex].Buffer; int commandLen = BitConverter.ToInt32(tempByteArr, 0); while (dicBufferDic[dicBufferIndex].GetDataCount() >= (commandLen + 4) && dicBufferDic[dicBufferIndex].GetDataCount() > 0) { var tempArr = new byte[commandLen]; Array.Copy(tempByteArr, sizeof(int), tempArr, 0, commandLen); dicBufferDic[dicBufferIndex].Clear(commandLen + 4); completeByteArrList.Add(tempArr); if (dicBufferDic[dicBufferIndex].GetDataCount() <= 4) { break; } commandLen = BitConverter.ToInt32(tempByteArr, 0); //取出命令长度 } } else { var dy = new DynamicBufferManager(1024);//新建一个DynamicBufferManager,如果处理完后有不完整的包就放入到缓存区 dy.WriteBuffer(byteRecive); var tempByteArr = dy.Buffer; int commandLen = BitConverter.ToInt32(tempByteArr, 0); while (dy.GetDataCount() >= (commandLen + 4) && dy.GetDataCount() > 0) { var tempArr = new byte[commandLen]; Array.Copy(tempByteArr, sizeof(int), tempArr, 0, commandLen); dy.Clear(commandLen + 4); completeByteArrList.Add(tempArr); if (dy.GetDataCount() <= 4) { break; } commandLen = BitConverter.ToInt32(tempByteArr, 0); //取出命令长度 } //如果当前的 byte 数组 里面有剩余字节,就加到粘包的缓存区 if (dy.GetDataCount() > 0) { dicBufferDic.TryAdd(dicBufferIndex, dy); } } return(completeByteArrList); //complete.Add(completeByteArrList); //return complete; } catch (Exception ex) { Console.WriteLine(ex.Message); return(completeByteArrList); } }