private void OnAck(Packet packet) { // 遍历处理超过32次收包未被应答的包 foreach (byte seq in quantics.Keys) { if (packet.ack > seq && (packet.ack - seq).value >= 32) { cacheLost.Add(seq); } } foreach (byte seq in cacheLost) { Packet p = quantics[seq]; quantics.Remove(seq); OnPacketLoss(p); } cacheLost.Clear(); // 对已发包列表应用应答,移除已被应答的包 for (int i = 0; i < 32; i++) { if ((packet.ackbit & (1 << i)) > 0) { byte seq = (packet.ack - i).value; if (quantics.ContainsKey(seq)) { Packet p = quantics[seq]; quantics.Remove(seq); OnPacketArrived(p); } } } // 写收包应答 if (packet.sequence > ack) { ackbit = ackbit << (int)(packet.sequence - ack).value; ackbit |= (1 << 0); ack = packet.sequence; OnPacketReceived(packet); } else { uint value = (uint)(1 << (int)(ack - packet.sequence).value); if ((ackbit & value) == 0) { // 如果收到的包是未被处理的 ackbit |= value; OnPacketReceived(packet); } else { Debug.Log("Receive packet already handle : sequence " + packet.sequence); } } }
public override void Parse(BinaryReader reader) { mFrame = reader.ReadByte(); mDatas.Clear(); byte length = reader.ReadByte(); for (byte i = 0; i < length; i++) { PlayerInput input = new PlayerInput(mFrame); input.Parse(reader); mDatas.Add(input); } }
public override void Parse(BinaryReader reader) { type = (PacketType)reader.ReadByte(); id = reader.ReadUInt32(); sequence = reader.ReadByte(); ack = reader.ReadByte(); ackbit = reader.ReadUInt32(); long dataLen = reader.BaseStream.Length - reader.BaseStream.Position; if (dataLen > 0) { data = new byte[dataLen]; reader.Read(data, 0, data.Length); } }
public USocket(uint id) { this.id = id; netState = NetState.None; sequence = 0; ack = 0; ackbit = 0; quantics = new Dictionary <byte, Packet>(); cacheSend = new List <Packet>(); cacheReceived = new List <Packet>(); cacheLost = new List <byte>(); lastConnectTime = lastReceviedTime = DateTime.MinValue; connectTimes = 0; sends = new LimitedQueue <Packet>(10); receives = new LimitedQueue <Packet>(10); }
private void FixedUpdate() { if (LSState > LockStepState.None) { if (LSFrameAchieve) { if (LSAccFrame == 0) { float deltaTime = Time.fixedDeltaTime; float accTime = LSTick + deltaTime; LSAccFrame = Mathf.FloorToInt(accTime / NetConfig.TPF); LSTick = accTime - LSAccFrame * NetConfig.TPF; } while (LSAccFrame > 0) { SendPlayerInput(); LSAccFrame -= 1; LSFrame += 1; LSFrameAchieve = false; if (LSState == LockStepState.Prepare) { if (LSFrame > new RUShortInt(NetConfig.PDBL - 1)) { LSState = LockStepState.Start; } else { LSFrameAchieve = true; } } if (LSState == LockStepState.Start) { LSFrameAchieve = LockStepUpdate(); } if (!LSFrameAchieve) { break; } } } else { LSFrameAchieve = LockStepUpdate(); } } }
public virtual void Close() { netState = NetState.None; sequence = 0; ack = 0; ackbit = 0; quantics.Clear(); cacheSend.Clear(); cacheReceived.Clear(); cacheLost.Clear(); lastConnectTime = lastReceviedTime = DateTime.MinValue; connectTimes = 0; sends.Clear(); receives.Clear(); try { if (rc != null) { rc.Close(); } } catch (Exception ecp) { Debug.LogError(ecp.Message + "\n" + ecp.StackTrace); } try { if (sc != null) { sc.Close(); } } catch (Exception ecp) { Debug.LogError(ecp.Message + "\n" + ecp.StackTrace); } rc = null; sc = null; ep = null; }
private void ReceivePacketHandler(Packet packet) { if (packet.type == PacketType.Message) { if (LSState == LockStepState.None) { LSState = LockStepState.Prepare; } } else if (packet.type == PacketType.LockStep) { PlayersInputBuffer pib = new PlayersInputBuffer(); pib.Parse(packet.data); RUShortInt CFrame = LSFrame + RUShortInt.Reverse(NetConfig.PDBL); int index = pib.buffer.FindIndex((PlayersInput each) => each.frame == CFrame); if (index > 0) { pib.buffer.RemoveRange(0, index); } SLSBuffer.Merge(pib); } }
private bool LockStepUpdate() { float speedTo = 1; RUShortInt CFrame = LSFrame + RUShortInt.Reverse(NetConfig.PDBL); List <PlayersInput> buffer = SLSBuffer.buffer; int lsIndex = buffer.FindIndex(0, buffer.Count, (PlayersInput each) => each.frame == CFrame); if (lsIndex == -1) { speedTo = 0; } else { RUShortInt minFrame = buffer[0].frame; RUShortInt maxFrame = buffer[buffer.Count - 1].frame; if (CFrame == minFrame) { uint dist = (maxFrame - minFrame).value; speedTo = dist <= NetConfig.PDBL ? 1 : 2; } else { speedTo = 0; } } gameSpeed = speedTo; if (gameSpeed > 0) { ApplyPlayersInput(SLSBuffer.buffer[0]); SLSBuffer.buffer.RemoveAt(0); return(true); } return(false); }
public PlayerInput(RUShortInt frame) : base() { mFrame = frame; }
/// <summary> /// 取反 /// </summary> /// <param name="val"></param> /// <returns></returns> public static RUShortInt Reverse(RUShortInt val) { return(new RUShortInt(byte.MaxValue - val.value + 1)); }
private void OnGUI() { GUILayout.BeginHorizontal(); GUILayout.Label("ID"); ID = uint.Parse(GUILayout.TextField(ID.ToString())); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("server ip"); byte[] bip = serverAddress.GetAddressBytes(); for (int i = 0; i < bip.Length; i++) { bip[i] = System.Convert.ToByte(GUILayout.TextField(bip[i].ToString())); } serverAddress = new IPAddress(bip); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("server port"); serverPort = int.Parse(GUILayout.TextField(serverPort.ToString())); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("client port"); clientPort = int.Parse(GUILayout.TextField(clientPort.ToString())); GUILayout.EndHorizontal(); GUI.enabled = socket == null || socket.netState == NetState.None; if (GUILayout.Button("Connect", GUILayout.Width(200), GUILayout.Width(80))) { LSState = LockStepState.None; LSTick = 0; LSFrame = 0; LSFrameAchieve = true; LSAccFrame = 0; SLSBuffer = new PlayersInputBuffer(); socket = new AppSocket(ID); socket.packetHandler[PacketType.Message] = ReceivePacketHandler; socket.packetHandler[PacketType.LockStep] = ReceivePacketHandler; socket.Connect(serverAddress, serverPort, clientPort); } GUI.enabled = true; GUI.color = socket != null && socket.netState == NetState.Connected ? Color.green : Color.white; GUILayout.Label("状态: " + (socket != null ? socket.netState : NetState.None)); GUI.color = Color.white; GUILayout.Label("延迟: " + (socket != null ? ((int)(socket.latency * 1000)).ToString() : "")); GUILayout.Label("速度: " + gameSpeed); if (socket != null) { // 已发送包 Packet[] sends = socket.sends.ToArray(); for (int i = 0; i < sends.Length; i++) { GUI.color = sends[i].arrived ? Color.green : Color.white; GUILayout.Label(sends[i].sequence + " " + sends[i].type); GUI.color = Color.white; } // 已接收包 GUILayout.BeginArea(new Rect(300, 20, 200, 600)); Packet[] receives = socket.receives.ToArray(); for (int i = 0; i < receives.Length; i++) { GUILayout.Label(receives[i].sequence + " " + receives[i].type); } GUILayout.EndArea(); } }