private void CheckReceivePackageLoss(NetUdpFixedSizePackage mPackage)
        {
            if (mPackage.nOrderId == nCurrentWaitReceiveOrderId)
            {
                CheckCombinePackage(mPackage);
                AddReceivePackageOrderId();

                while (!mReceiveLossPackageDic.IsEmpty)
                {
                    NetUdpFixedSizePackage mTempPackage = null;
                    if (mReceiveLossPackageDic.TryRemove(nCurrentWaitReceiveOrderId, out mTempPackage))
                    {
                        CheckCombinePackage(mTempPackage);
                        AddReceivePackageOrderId();
                    }
                    else
                    {
                        break;
                    }
                }
            }
            else if (mPackage.nOrderId > nCurrentWaitReceiveOrderId)
            {
                if (mReceiveLossPackageDic.TryAdd(mPackage.nOrderId, mPackage))
                {
                    DebugSystem.LogError("Server Package Loss: " + nCurrentWaitReceiveOrderId + " | " + mPackage.nOrderId);
                }
            }
            else
            {
                DebugSystem.LogError("Server 接受 过去的 废物包: " + mPackage.nOrderId);
                ObjectPoolManager.Instance.mUdpFixedSizePackagePool.recycle(mPackage);
            }
        }
        private void CheckCombinePackage(NetUdpFixedSizePackage mPackage)
        {
            if (mPackage.nGroupCount > 1)
            {
                NetCombinePackage cc = ObjectPoolManager.Instance.mCombinePackagePool.Pop();
                cc.Init(mPackage);
                mCombinePackageQueue.Enqueue(cc);
            }
            else
            {
                if (!mCombinePackageQueue.IsEmpty)
                {
                    NetCombinePackage currentGroup = null;
                    if (mCombinePackageQueue.TryPeek(out currentGroup))
                    {
                        currentGroup.Add(mPackage);

                        if (currentGroup.CheckCombineFinish())
                        {
                            if (mCombinePackageQueue.TryDequeue(out currentGroup))
                            {
                                mUdpPeer.AddLogicHandleQueue(currentGroup);
                            }
                        }
                    }
                }
                else
                {
                    mUdpPeer.AddLogicHandleQueue(mPackage);
                }
            }
        }
        private void AddSendCheck(NetUdpFixedSizePackage mPackage)
        {
            if (ServerConfig.bNeedCheckPackage)
            {
                //mPackage.nOrderId = nCurrentWaitSendOrderId;

                UInt16           nOrderId   = mPackage.nOrderId;
                CheckPackageInfo mCheckInfo = mCheckPackagePool.Pop();
                mCheckInfo.nReSendCount = 0;
                mCheckInfo.mPackage     = mPackage;
                mCheckInfo.mTimer.restart();

                if (mWaitCheckSendDic.TryAdd(nOrderId, mCheckInfo))
                {
                    //AddSendPackageOrderId ();
                }
                else
                {
                    throw new Exception("请增大循环Id 的范围,或者 减慢发包速度");
                }
            }

            DebugSystem.Assert(mPackage.nOrderId >= ServerConfig.nUdpMinOrderId);
            //DebugSystem.Log ("Server Send nOrderId: " + mPackage.nOrderId);
            mUdpPeer.SendNetPackage(mPackage);
        }
Beispiel #4
0
        private void Combine(NetUdpFixedSizePackage mPackage)
        {
            int nCopyLength = mPackage.Length - ServerConfig.nUdpPackageFixedHeadSize;

            Array.Copy(mPackage.buffer, ServerConfig.nUdpPackageFixedHeadSize, base.buffer, base.Length, nCopyLength);
            base.Length += nCopyLength;
        }
Beispiel #5
0
        public void Add(NetUdpFixedSizePackage mPackage)
        {
            Combine(mPackage);
            nGetCombineCount++;

            ObjectPoolManager.Instance.mUdpFixedSizePackagePool.recycle(mPackage);
        }
        private void SendHeartBeat()
        {
            HeartBeat sendMsg = new HeartBeat();
            NetUdpFixedSizePackage mPackage = GetUdpSystemPackage(UdpNetCommand.COMMAND_HEARTBEAT, sendMsg);

            SendNetPackage(mPackage);
            //ObjectPoolManager.Instance.mUdpFixedSizePackagePool.recycle (mPackage);
        }
Beispiel #7
0
        private void ReceiveThreadUpdate()
        {
            while (true)
            {
                int length = 0;
                try {
                    EndPoint tempEndPoint           = new IPEndPoint(IPAddress.Broadcast, 0);
                    NetUdpFixedSizePackage mPackage = ObjectPoolManager.Instance.mUdpFixedSizePackagePool.Pop();
                    length          = mSocket.ReceiveFrom(mPackage.buffer, ref tempEndPoint);
                    mPackage.Length = length;

                    if (length > 0)
                    {
                        NetEndPointPackage mEndPointPackage = ObjectPoolManager.Instance.mNetEndPointPackagePool.Pop();
                        mEndPointPackage.mPackage        = mPackage;
                        mEndPointPackage.mRemoteEndPoint = tempEndPoint;
                        mReceivePackageQueue.Enqueue(mEndPointPackage);
                    }
                    else
                    {
                        ObjectPoolManager.Instance.mUdpFixedSizePackagePool.recycle(mPackage);

                        DebugSystem.LogError("接受长度: " + length);
                        break;
                    }
                } catch (SocketException e) {
                    if (e.SocketErrorCode == SocketError.Interrupted)
                    {
                        DebugSystem.LogWarning("阻塞Socket 调用已被取消");
                    }
                    else
                    {
                        DebugSystem.LogWarning("SocketException: " + e.SocketErrorCode);
                    }
                    break;
                } catch (Exception e) {
                    DebugSystem.LogError("服务器 异常: " + e.Message + " | " + e.StackTrace);

                    m_state = NETSTATE.DISCONNECTED;
                    peer_event mEvent = new peer_event();
                    mEvent.mNetEventType = NETEVENT.DISCONNECTED;
                    mEvent.msg           = e.Message;

                    break;
                }
            }

            DebugSystem.LogWarning("Server ReceiveThread Safe Quit !");
        }
        public static void Encryption(NetUdpFixedSizePackage mPackage)
        {
            UInt16 nOrderId    = mPackage.nOrderId;
            UInt16 nGroupCount = mPackage.nGroupCount;
            UInt16 nPackageId  = mPackage.nPackageId;

            Array.Copy(mCheck, 0, mPackage.buffer, 0, 4);

            byte[] byCom = BitConverter.GetBytes(nOrderId);
            Array.Copy(byCom, 0, mPackage.buffer, 4, byCom.Length);
            byCom = BitConverter.GetBytes(nGroupCount);
            Array.Copy(byCom, 0, mPackage.buffer, 6, byCom.Length);
            byCom = BitConverter.GetBytes(nPackageId);
            Array.Copy(byCom, 0, mPackage.buffer, 8, byCom.Length);
        }
        public void ReceiveCheckPackage(NetUdpFixedSizePackage mPackage)
        {
            //DebugSystem.Log ("Server ReceiveInfo: " + mPackage.nOrderId + " | " + mPackage.nGroupCount + " | " + mPackage.Length);

            if (ServerConfig.bNeedCheckPackage)
            {
                PackageCheckResult mResult = new PackageCheckResult();
                if (bClient)
                {
                    mResult.NWhoOrderId = (UInt32)(2 << 16 | mPackage.nOrderId);
                }
                else
                {
                    mResult.NWhoOrderId = (UInt32)(1 << 16 | mPackage.nOrderId);
                }
                NetUdpFixedSizePackage mCheckResultPackage = mUdpPeer.GetUdpSystemPackage(UdpNetCommand.COMMAND_PACKAGECHECK, mResult);

                CheckPackageInfo mCheckInfo = mCheckPackagePool.Pop();
                mCheckInfo.nReSendCount = 0;
                mCheckInfo.mPackage     = mCheckResultPackage;
                mCheckInfo.mTimer.restart();
                mWaitCheckReceiveDic.TryAdd(mPackage.nOrderId, mCheckInfo);

                mUdpPeer.SendNetPackage(mCheckResultPackage);

                CheckReceivePackageLoss(mPackage);
            }
            else
            {
#if !Test
                if (ServerConfig.IsLocalAreaNetWork)
                {
                    if (nCurrentWaitReceiveOrderId != mPackage.nOrderId)
                    {
                        DebugSystem.LogError("服务器端 丢包: " + mUdpPeer.getPort() + " | " + nCurrentWaitReceiveOrderId);
                    }
                    else
                    {
                        AddReceivePackageOrderId();
                    }
                }
#endif
                CheckCombinePackage(mPackage);
            }
        }
Beispiel #10
0
        public void Init(NetUdpFixedSizePackage mPackage)
        {
            base.nPackageId  = mPackage.nPackageId;
            base.nGroupCount = mPackage.nGroupCount;
            base.nOrderId    = mPackage.nOrderId;

            int nSumLength = base.nGroupCount * ServerConfig.nUdpPackageFixedBodySize + ServerConfig.nUdpPackageFixedHeadSize;

            if (base.buffer.Length < nSumLength)
            {
                base.buffer = new byte[nSumLength];
            }

            base.Length = ServerConfig.nUdpPackageFixedHeadSize;

            nGetCombineCount = 0;
            Add(mPackage);
        }
        public void SendCheckPackage(UInt16 id, byte[] buffer)
        {
            DebugSystem.Assert(id > 50, "Udp 系统内置命令 此逻辑不处理");

            int readBytes   = 0;
            int nBeginIndex = 0;

            UInt16 groupCount = 0;

            if (buffer.Length % ServerConfig.nUdpPackageFixedBodySize == 0)
            {
                groupCount = (UInt16)(buffer.Length / ServerConfig.nUdpPackageFixedBodySize);
            }
            else
            {
                groupCount = (UInt16)(buffer.Length / ServerConfig.nUdpPackageFixedBodySize + 1);
            }

            while (nBeginIndex < buffer.Length)
            {
                if (nBeginIndex + ServerConfig.nUdpPackageFixedBodySize > buffer.Length)
                {
                    readBytes = buffer.Length - nBeginIndex;
                }
                else
                {
                    readBytes = ServerConfig.nUdpPackageFixedBodySize;
                }

                NetUdpFixedSizePackage mPackage = ObjectPoolManager.Instance.mUdpFixedSizePackagePool.Pop();
                mPackage.nGroupCount = groupCount;
                mPackage.nPackageId  = id;
                mPackage.nOrderId    = nCurrentWaitSendOrderId;
                mPackage.Length      = readBytes + ServerConfig.nUdpPackageFixedHeadSize;
                Array.Copy(buffer, nBeginIndex, mPackage.buffer, ServerConfig.nUdpPackageFixedHeadSize, readBytes);

                NetPackageEncryption.Encryption(mPackage);
                AddSendCheck(mPackage);

                AddSendPackageOrderId();
                nBeginIndex += readBytes;
                groupCount   = 1;
            }
        }
Beispiel #12
0
        public void ReceiveUdpSocketFixedPackage(NetUdpFixedSizePackage mPackage)
        {
            bool bSucccess = NetPackageEncryption.DeEncryption(mPackage);

            if (bSucccess)
            {
                if (mPackage.nPackageId > 50)
                {
                    mUdpCheckPool.ReceiveCheckPackage(mPackage);
                }
                else
                {
                    PackageManager.Instance.Execute(this as ClientPeer, mPackage);
                }
            }
            else
            {
                throw new Exception("解码失败 !!!");
            }
        }
        public static bool DeEncryption(NetUdpFixedSizePackage mPackage)
        {
            if (mPackage.Length < ServerConfig.nUdpPackageFixedHeadSize)
            {
                DebugSystem.LogError("mPackage Length: " + mPackage.Length);
                return(false);
            }

            for (int i = 0; i < 4; i++)
            {
                if (mPackage.buffer [i] != mCheck [i])
                {
                    DebugSystem.LogError("22222222222222222222222222");
                    return(false);
                }
            }

            mPackage.nOrderId    = BitConverter.ToUInt16(mPackage.buffer, 4);
            mPackage.nGroupCount = BitConverter.ToUInt16(mPackage.buffer, 6);
            mPackage.nPackageId  = BitConverter.ToUInt16(mPackage.buffer, 8);
            return(true);
        }