protected void WorkThreadOperateLoop() { var deltaTime = UDPBoxUtility.GetDeltaTime(mLastWorkThreadTime); if (mRefreshDelayTimer <= 0) { for (int i = mLargePackageInfoList.Count - 1; i >= 0; i--) { var largePackageInfo = mLargePackageInfoList[i]; largePackageInfo.RecycleTimer -= deltaTime; if (largePackageInfo.RecycleTimer <= 0f) { mLargePackageInfoList.RemoveAt(i); } } mRefreshDelayTimer = REFRESH_DELAY; } else { mRefreshDelayTimer -= deltaTime; } mLastWorkThreadTime = DateTime.Now.Ticks; }
void ACKWaitPackageLogicUpdate() { var deltaTime = UDPBoxUtility.GetDeltaTime(mLastTick); for (int i = 0, iMax = mWaitACKInfoList.Count; i < iMax; i++) { var item = mWaitACKInfoList[i]; if (item.Timer <= 0f) { mUdpBox.SendMessage(item.Bytes, new IPEndPoint(IPAddress.Parse(item.IPEndPoint_IPAddress), item.IPEndPoint_Port)); item.Timer = mACKDetectDelayTime; } else { item.Timer -= deltaTime; } mWaitACKInfoList[i] = item; } mLastTick = DateTime.Now.Ticks; }
void RefreshConnectStateInWorkThread() { var deltaTime = UDPBoxUtility.GetDeltaTime(mLastWorkThreadTime); if (IsMaster) { if (ClientIPConnectList.Count > 0) { State = EState.HasClients; } else { State = EState.NoClients; } for (int i = 0, iMax = ClientIPConnectList.Count; i < iMax; i++) { var item = ClientIPConnectList[i]; if (!item.Valid) { continue; } item = new ConnectInfo() { AliveTimer = item.AliveTimer + deltaTime, IPEndPoint = item.IPEndPoint, BeginPort = item.BeginPort, EndPort = item.EndPort, IsClientEstablished = item.IsClientEstablished, }; ClientIPConnectList[i] = item; } } else { if (MasterIPConnectInfo.Valid) { State = EState.HasServer; MasterIPConnectInfo = new ConnectInfo() { AliveTimer = MasterIPConnectInfo.AliveTimer + deltaTime, IPEndPoint = MasterIPConnectInfo.IPEndPoint, BeginPort = MasterIPConnectInfo.BeginPort, EndPort = MasterIPConnectInfo.EndPort, IsClientEstablished = MasterIPConnectInfo.IsClientEstablished, }; } else { State = EState.NoServer; } } //update ticks. if (IsMaster) { for (int i = ClientIPConnectList.Count - 1; i >= 0; i--) { var item = ClientIPConnectList[i]; if (!item.Valid) { continue; } if (!item.IsClientEstablished && item.AliveTimer > TIME_OUT_NOT_ESTABLISH_CONNECT_FLOAT) { ClientIPConnectList.RemoveAt(i); } else if (item.AliveTimer > TIME_OUT_CONNECT_FLOAT) { ClientIPConnectList.RemoveAt(i); OnClientTimeOut?.Invoke(item.IPEndPoint); } } } else { if (MasterIPConnectInfo.Valid) { if (MasterIPConnectInfo.AliveTimer > TIME_OUT_CONNECT_FLOAT) { MasterIPConnectInfo = new ConnectInfo(); OnMasterIPTimeOut?.Invoke(); } } } //update timeout. if (mPingTargetThreadTimer <= 0f) { mPingPongPackageTemplate.PingPong = PingPongPackage.EPingPong.Ping; if (IsMaster) { for (int i = 0, iMax = ClientIPConnectList.Count; i < iMax; i++) { var item = ClientIPConnectList[i]; if (item.Valid && item.IsClientEstablished) { SendUDPMessageToRandomPort(mPingPongPackageTemplate.Serialize(), item); } } } else { if (MasterIPConnectInfo.Valid) { SendUDPMessageToRandomPort(mPingPongPackageTemplate.Serialize(), MasterIPConnectInfo); } } mPingTargetThreadTimer = PING_CONNECT_TIME_FLOAT; } else { mPingTargetThreadTimer -= deltaTime; }//ping connect. mLastWorkThreadTime = DateTime.Now.Ticks; }