private void RecvData(DataEventArgs dataEventArgs) { int rlen = dataEventArgs.Length - dataEventArgs.Offset; if (rlen > 0) { if (packageTrigger) { /// annalyze the package head if (rlen >= NetUtils.MSG_HEADER_LEN) { Array.Copy(dataEventArgs.Data, dataEventArgs.Offset, headData, headDataLen, NetUtils.MSG_HEADER_LEN - headDataLen); using (MemoryStream ms = new MemoryStream(headData)) { using (BinaryReader br = new BinaryReader(ms)) { br.ReadByte(); int msgLen = br.ReadInt32(); if (!adapter.IsLittleEnd()) { msgLen = msgLen.SwapInt32(); } totalLength = NetUtils.MSG_HEADER_LEN + msgLen; } } if (totalLength <= 0) { Debugger.LogError("total len <= 0 close->" + totalLength); onClosed(null, null); } if (totalLength > cacheRecvData.Length) { cacheRecvData = new byte[totalLength]; } } } if (totalLength <= 0) { headDataLen = dataEventArgs.Length - dataEventArgs.Offset; Array.Copy(dataEventArgs.Data, dataEventArgs.Offset, headData, 0, headDataLen); return; } int bufLen = 0; int blen = totalLength - currentLength; if (rlen >= blen) { bufLen = blen; if (headDataLen > 0) { Array.Copy(headData, 0, cacheRecvData, currentLength, headDataLen); currentLength += headDataLen; bufLen -= headDataLen; headDataLen = 0; } } else { bufLen = rlen; } Array.Copy(dataEventArgs.Data, dataEventArgs.Offset, cacheRecvData, currentLength, bufLen); currentLength += bufLen; dataEventArgs.Offset += bufLen; if (totalLength > currentLength) { packageTrigger = false; } else if (rlen > bufLen) { packageTrigger = true; Deserialize(cacheRecvData, totalLength); Clear(); RecvData(dataEventArgs); } else if (rlen == bufLen) { packageTrigger = true; Deserialize(cacheRecvData, totalLength); Clear(); } else if (totalLength < currentLength) { onClosed(null, null); } } total++; }
private void RecvData(DataEventArgs dataEventArgs) { int rlen = dataEventArgs.Length - dataEventArgs.Offset; if (rlen > 0) { if (packageTrigger) { if (rlen >= NetUtils.MSG_HEADER_LEN) { Array.Copy(dataEventArgs.Data, dataEventArgs.Offset, headData, headDataLen, NetUtils.MSG_HEADER_LEN - headDataLen); using (MemoryStream ms = new MemoryStream(headData)) { using (BinaryReader br = new BinaryReader(ms)) { br.ReadByte(); int msgLen = br.ReadInt32(); if (!adapter.IsLittleEnd()) { msgLen = msgLen.SwapInt32(); } totalLength = NetUtils.MSG_HEADER_LEN + msgLen; } } if (totalLength <= 0) { Debugger.LogError("total len <= 0 close->" + totalLength); } if (totalLength > currentBody.Length) { currentBody = new byte[totalLength]; } } } if (totalLength <= 0) { headDataLen = dataEventArgs.Length - dataEventArgs.Offset; Array.Copy(dataEventArgs.Data, dataEventArgs.Offset, headData, 0, headDataLen); return; } int bufLen = 0; int blen = totalLength - currentLength; if (rlen >= blen) { bufLen = blen; if (headDataLen > 0) { Array.Copy(headData, 0, currentBody, currentLength, headDataLen); currentLength += headDataLen; bufLen -= headDataLen; headDataLen = 0; } } else { bufLen = rlen; } //Debug.Log("analysis data 10->" + bufLen + "^" + dataEventArgs.Offset + "^" + currentLength); Array.Copy(dataEventArgs.Data, dataEventArgs.Offset, currentBody, currentLength, bufLen); currentLength += bufLen; dataEventArgs.Offset += bufLen; //Debugger.Log("analysis data 11->" + totalLength + "^" + currentLength + "^" + rlen + "^" + bufLen); if (totalLength > currentLength) { //Debug.Log("analysis data 12"); packageTrigger = false; } else if (rlen > bufLen) { packageTrigger = true; Deserialize(currentBody, totalLength); Clear(); RecvData(dataEventArgs); } else if (rlen == bufLen) { //Debug.Log("analysis data 13"); packageTrigger = true; //_dataHandler(currentBody); Deserialize(currentBody, totalLength); Clear(); } else if (totalLength < currentLength) { //Debug.LogError("total len < currentLen close->" + TotalLength + "^" + currentLength); } } total++; }