//TODO?: public void onReceivePing(PingMessage pm) public SendRecord GetSendRecord(int timeId) { SendRecord record; lock (SynTimeId) { record = SendRecordTable[timeId]; if (record == null) { record = new SendRecord(); record.TimeId = timeId; SendRecordTable.Add(timeId, record); } } return(record); }
void SendDataPacket(DataPacket dataPacket, bool resend, bool twice, bool block) { lock (Conn.MyClientControl.SynLock) { long startTime = DateTimeExtensions.NanoTime(); long t1 = DateTimeExtensions.CurrentTimeMillis(); Conn.MyClientControl.OnSendDataPacket(Conn); int timeId = Conn.MyClientControl.GetCurrentTimeId(); dataPacket.Create(timeId); SendRecord currentRecord = Conn.MyClientControl.GetSendRecord(timeId); if (!resend) { dataPacket.FirstSendTimeId = timeId; dataPacket.FirstSendTime = DateTimeExtensions.CurrentTimeMillis(); currentRecord.AddSentFirst(dataPacket.Data.Length); currentRecord.AddSent(dataPacket.Data.Length); } else { SendRecord record = Conn.MyClientControl.GetSendRecord(dataPacket.FirstSendTimeId); record.AddResent(dataPacket.Data.Length); currentRecord.AddSent(dataPacket.Data.Length); } //try SendSum += 1; Sum += 1; UnAckMax += 1; Send(dataPacket.MyDatagramPacket); if (twice) { Send(dataPacket.MyDatagramPacket); } if (block) { Conn.MyClientControl.SendSleep(startTime, dataPacket.Data.Length); } TrafficEvent e = new TrafficEvent("", (long)Ran.Next(), dataPacket.Data.Length, TrafficEvent.Upload); Route.FireEvent(e); } }
public void OnReceivePacket(DatagramPacket datagramPacket) { DataPacket dataPacket; if (datagramPacket != null) { if (Conn.IsConnected) { int ver = PacketCheck.CheckVer(datagramPacket); int sType = PacketCheck.CheckSType(datagramPacket); if (ver == RUDPConfig.ProtocalVer) { Conn.Live(); if (sType == PacketType.DataPacket) { dataPacket = new DataPacket(datagramPacket); int timeId = dataPacket.TimeId; SendRecord record = Conn.MyClientControl.SendRecordTableRemote[timeId]; if (record == null) { record = new SendRecord(); record.TimeId = timeId; Conn.MyClientControl.SendRecordTableRemote.Add(timeId, record); } record.AddSent(dataPacket.Data.Length); if (timeId > CurrentRemoteTimeId) { CurrentRemoteTimeId = timeId; } int sequence = dataPacket.Sequence; Conn.MySender.SendAckDelay(dataPacket.Sequence); if (sequence > LastRead) { lock (AvailOb) { ReceiveTable.Add(sequence, dataPacket); if (ReceiveTable.ContainsKey(LastRead + 1)) { Monitor.Pulse(AvailOb); } } } } else if (sType == PacketType.AckListPacket) { AckListPacket ackListPacket = new AckListPacket(datagramPacket); int lastRead3 = ackListPacket.LastRead; if (lastRead3 > LastRead2) { LastRead2 = lastRead3; } List <int> ackList = ackListPacket.AckList; foreach (int sequence in ackList) { Conn.MySender.RemoveSentAck(sequence); } SendRecord rc1 = Conn.MyClientControl.GetSendRecord(ackListPacket.R1); if (rc1 != null && ackListPacket.S1 > rc1.AckedSize) { rc1.AckedSize = ackListPacket.S1; } SendRecord rc2 = Conn.MyClientControl.GetSendRecord(ackListPacket.R2); if (rc2 != null && ackListPacket.S2 > rc2.AckedSize) { rc2.AckedSize = ackListPacket.S2; } SendRecord rc3 = Conn.MyClientControl.GetSendRecord(ackListPacket.R3); if (rc3 != null && ackListPacket.S3 > rc3.AckedSize) { rc3.AckedSize = ackListPacket.S3; } if (CheckWin()) { Conn.MySender.Play(); } } else if (sType == PacketType.CloseStreamPacket) { CloseStreamPacket closeStreamPacket = new CloseStreamPacket(datagramPacket); ReceviedClose = true; int n = closeStreamPacket.CloseOffset; CloseRemoteStream(n); } else if (sType == PacketType.CloseConnPacket) { CloseConnPacket closeConnPacket = new CloseConnPacket(datagramPacket); Conn.CloseRemote(); } else { throw new Exception("Unknown packet type"); } } } } }