public void ReleaseRecvData(RecvData rcv) { lock (this) { mRecvDataPool.Add(rcv); } }
private void OnPacketOK(RecvData rcvData) { if (DiscardAllPacket) { return; } lock (mRecvQueue) { mRecvQueue.Enqueue(rcvData); } }
public unsafe bool ParsePackage(byte *pData, UInt32 length, FOnPacketOK onPacket, PkgPoolManager parameter) { lock (this) { //int whileCount = 0; while (true) { //++whileCount; //if (whileCount >= 2) //{ // Log.FileLog.WriteLine($"ParsePackage whileCount = {whileCount}"); //} if (length == 0) { return(true); } unsafe { //包头还没有读出来,不知道长度 if (PacketSize == 0) { if (CurPos + length < PacketHeadSize) {//加上新读取的都还没有完成包头 AppendData(pData, length, ref length); return(true); } else { var remainHead = PacketHeadSize - CurPos; pData = AppendData(pData, remainHead, ref length); fixed(byte *pBuffer = &mDataBuffer[0]) { PacketSize = ((RPCHeader *)pBuffer)->PackageSize; } } } if (PacketSize == 0 || PacketSize >= UInt16.MaxValue) {//被修改或者错误的包 return(false); } if (CurPos + length < PacketSize) {//还不够 AppendData(pData, length, ref length); return(true); } else { //if (PacketSize == 0) // return false; pData = AppendData(pData, PacketSize - CurPos, ref length); //int pkgLength = (int)PacketSize; #region CreateFullPacket var pkg = RecvData.CreateData(parameter, mDataBuffer, (int)PacketSize); CurPos = 0; PacketSize = 0; #endregion onPacket(pkg); //return ParsePackage(pData, length, onPacket, parameter); } } } } }
public void Update2() { try { RecvData vBytes = null; PacketNumber = mRecvQueue.Count; int WeakPkgNum = 0; int nProcNumber = 0; bool DiscardWeak = false; if (PacketNumber > RecvPacketNumLimitter) { DiscardWeak = true; } lock (mRecvQueue) { for (int i = 0; i < PacketNumber; i++) { if (mRecvQueue.Count == 0) { break; } vBytes = mRecvQueue.Dequeue(); if (vBytes == null) { continue; } if (DiscardWeak) { unsafe { fixed(byte *pPkg = &vBytes.PkgData[0]) { if (((RPCHeader *)pPkg)->IsWeakPkg()) { WeakPkgNum++; continue; } } } } nProcNumber++; if (OnReceiveData != null) { OnReceiveData(this, vBytes.PkgData, vBytes.Length, vBytes.RecvTime); } vBytes.Dispose(); } } KickedWeakPkgNum = WeakPkgNum; ProcPackNumber = nProcNumber; } catch (System.Exception ex) { Profiler.Log.WriteException(ex); } if (mRun == false && this.Connected == false) { if (OnDisconnected != null) { OnDisconnected(this); } } }
public void Update1() { try { RecvData vBytes = null; PacketNumber = mRecvQueue.Count; int WeakPkgNum = 0; if (PacketNumber > RecvPacketNumLimitter) { lock (mRecvQueue) { for (int i = 0; i < PacketNumber; i++) { vBytes = mRecvQueue.Dequeue(); if (vBytes == null) { continue; } unsafe { fixed(byte *pPkg = &vBytes.PkgData[0]) { if (((RPCHeader *)pPkg)->IsWeakPkg()) { WeakPkgNum++; continue; } else { mRecvQueue.Enqueue(vBytes); } } } } } } KickedWeakPkgNum = WeakPkgNum; int nPacket = mRecvQueue.Count; if (nPacket > RecvPacketNumPerFrame) { nPacket = RecvPacketNumPerFrame; } int nProcNumber = 0; if (OnReceiveData != null) { while (mRecvQueue.Count > 0 && nPacket > 0) { if (mRecvQueue.Count == 0) { continue; } nPacket--; lock (mRecvQueue) { vBytes = mRecvQueue.Dequeue(); } if (vBytes == null) { break; } nProcNumber++; OnReceiveData(this, vBytes.PkgData, vBytes.Length, vBytes.RecvTime); vBytes.Dispose(); } } ProcPackNumber = nProcNumber; } catch (System.Exception ex) { Profiler.Log.WriteException(ex); } if (mRun == false && this.Connected == false) { if (OnDisconnected != null) { OnDisconnected(this); } } }