Пример #1
0
        public void AddTask(ConnectionUDP conn, int sequence)
        {
            ResendItem resendItem = new ResendItem(conn, sequence);

            resendItem.ResendTime = GetNewResendTime(conn);
            TaskList.Add(resendItem);
        }
Пример #2
0
 public UDPOutputStream(ConnectionUDP conn)
 {
     Conn     = conn;
     DstHost  = conn.DstHost;
     DstPort  = conn.DstPort;
     MySender = conn.MySender;
 }
Пример #3
0
 public void RemoveConnection(ConnectionUDP conn)
 {
     lock (SynConnTable)
     {
         ConnTable.Remove(conn.ConnectId);
     }
 }
Пример #4
0
 public void AddConnection(ConnectionUDP conn)
 {
     lock (SynConnTable)
     {
         ConnTable.Add(conn.ConnectId, conn);
     }
 }
Пример #5
0
 public void RemoveConnection(ConnectionUDP conn)
 {
     lock (this)
     {
         ClosedTable.Add(conn.ConnectId);
         ConnTable.Remove(conn.ConnectId);
     }
 }
Пример #6
0
 public Receiver(ConnectionUDP conn)
 {
     Conn = conn;
     Uis = new UDPInputStream(conn);
     MySender = conn.MySender;
     DstHost = conn.DstHost;
     DstPort = conn.DstPort;
 }
Пример #7
0
 public Receiver(ConnectionUDP conn)
 {
     Conn     = conn;
     Uis      = new UDPInputStream(conn);
     MySender = conn.MySender;
     DstHost  = conn.DstHost;
     DstPort  = conn.DstPort;
 }
Пример #8
0
 public Sender(ConnectionUDP conn)
 {
     Conn       = conn;
     Uos        = new UDPOutputStream(conn);
     MyReceiver = conn.MyRecevier;
     DstHost    = conn.DstHost;
     DstPort    = conn.DstPort;
 }
Пример #9
0
 public void AddLastRead(ConnectionUDP conn)
 {
     lock (SynAck)
     {
         if (!TaskTable.ContainsKey(conn.ConnectId))
         {
             AckListTask ackListTask = new AckListTask(conn);
             TaskTable.Add(conn.ConnectId, ackListTask);
         }
     }
 }
Пример #10
0
        long GetNewResendTime(ConnectionUDP conn)
        {
            int delayAdd = conn.MyClientControl.PingDelay +
                           (int)((float)conn.MyClientControl.PingDelay * RUDPConfig.ReSendDelay);

            if (delayAdd < RUDPConfig.ReSendDelayMin)
            {
                delayAdd = RUDPConfig.ReSendDelayMin;
            }

            return(DateTimeExtensions.CurrentTimeMillis() + delayAdd);
        }
Пример #11
0
        public void AddAck(ConnectionUDP conn, int sequence)
        {
            lock (SynAck)
            {
                AckListTask ackListTask;

                if (!TaskTable.ContainsKey(conn.ConnectId))
                {
                    ackListTask = new AckListTask(conn);
                    TaskTable.Add(conn.ConnectId, ackListTask);
                }

                ackListTask = TaskTable[conn.ConnectId];
                ackListTask.AddAck(sequence);
            }
        }
Пример #12
0
        public ConnectionUDP GetConnection2(string dstHost, int dstPort, int connectId, int clientId)
        {
            ConnectionUDP conn = ConnTable[connectId];

            if (conn == null)
            {
                ClientControl clientControl = MyClientManager.GetClientControl(clientId, dstHost, dstPort);
                conn = new ConnectionUDP(this, dstHost, dstPort, 2, connectId, clientControl);

                lock (this)
                {
                    ConnTable.Add(connectId, conn);
                }
                clientControl.AddConnection(conn);
            }
            return(conn);
        }
Пример #13
0
 public void Close()
 {
     Closed = true;
     MyRoute.MyClientManager.RemoveClient(ClientId);
     lock (SynConnTable)
     {
         foreach (KeyValuePair <int, ConnectionUDP> connItem in ConnTable)
         {
             ConnectionUDP conn = connItem.Value;
             if (conn != null)
             {
                 Task.Factory.StartNew(() => {
                     conn.StopNow = true;
                     conn.Destory(true);
                 });
             }
         }
     }
 }
Пример #14
0
 public AckListTask(ConnectionUDP conn)
 {
     Conn = conn;
 }
Пример #15
0
 public UDPInputStream(ConnectionUDP conn)
 {
     Conn       = conn;
     MyReceiver = conn.MyRecevier;
 }
Пример #16
0
 public void RemoveConnection(ConnectionUDP conn)
 {
     lock(this)
     {
         ClosedTable.Add(conn.ConnectId);
         ConnTable.Remove(conn.ConnectId);
     }
 }
Пример #17
0
        public ConnectionUDP GetConnection2(string dstHost, int dstPort, int connectId, int clientId)
        {
            ConnectionUDP conn = ConnTable[connectId];
            if (conn == null)
            {
                ClientControl clientControl = MyClientManager.GetClientControl(clientId, dstHost, dstPort);
                conn = new ConnectionUDP(this, dstHost, dstPort, 2, connectId, clientControl);

                lock (this)
                {
                    ConnTable.Add(connectId, conn);
                }
                clientControl.AddConnection(conn);
            }
            return conn;
        }
Пример #18
0
 public ResendItem(ConnectionUDP conn, int sequence)
 {
     Conn = conn;
     Sequence = sequence;
 }
Пример #19
0
 public ResendItem(ConnectionUDP conn, int sequence)
 {
     Conn     = conn;
     Sequence = sequence;
 }
Пример #20
0
 public void OnSendDataPacket(ConnectionUDP conn)
 {
 }
Пример #21
0
        public Route(int mode, int port = 150)
        {
            LocalClientId = Ran.Next();
            Mode          = mode;

            if (mode == ClientMode)
            {
                MyUdpClient = new UdpClient();
            }
            else if (mode == ClientMode)
            {
                MyUdpClient = new UdpClient(port);
            }

            MyClientManager = new ClientManager(this);
            Task.Factory.StartNew(() => {
                while (true)
                {
                    try
                    {
                        IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);
                        byte[] data = MyUdpClient.Receive(ref RemoteIpEndPoint);
                        DatagramPacket datagramPacket = new DatagramPacket(data, data.Length);
                        PacketBuffer.Add(datagramPacket);
                    }
                    catch (Exception e)
                    {
                        Thread.Sleep(1);
                        continue;
                    }
                }
            });

            Task.Factory.StartNew(() => {
                while (true)
                {
                    DatagramPacket datagramPacket = PacketBuffer.Take();
                    if (datagramPacket == null)
                    {
                        continue;
                    }

                    byte[] data = datagramPacket.Data;
                    if (data.Length < 4)
                    {
                        return;
                    }

                    int sType          = PacketCheck.CheckSType(datagramPacket);
                    int connectId      = BitConverter.ToInt32(data, 4);
                    int remoteClientId = BitConverter.ToInt32(data, 8);

                    if (ClosedTable.Contains(connectId) && connectId != 0)
                    {
                        continue;
                    }

                    ClientControl clientControl;
                    if (sType == PacketType.PingPacket || sType == PacketType.PingPacket2)
                    {
                        if (mode == ClientMode)
                        {
                            string key      = datagramPacket.Host + ":" + datagramPacket.Port;
                            int simClientId = Math.Abs(key.GetHashCode());
                            clientControl   = MyClientManager.GetClientControl(simClientId, datagramPacket.Host, datagramPacket.Port);
                        }
                        else if (mode == ServerMode)
                        {
                            clientControl = MyClientManager.GetClientControl(remoteClientId, datagramPacket.Host, datagramPacket.Port);
                        }
                    }
                    else
                    {
                        if (mode == ClientMode)
                        {
                            if (!SettedTable.Contains(remoteClientId))
                            {
                                string key      = datagramPacket.Host + ":" + datagramPacket.Port;
                                int simClientId = Math.Abs(key.GetHashCode());
                                clientControl   = MyClientManager.GetClientControl(simClientId, datagramPacket.Host, datagramPacket.Port);

                                if (clientControl.ClientIdReal == -1)
                                {
                                    clientControl.ClientIdReal = remoteClientId;
                                }
                                else if (clientControl.ClientIdReal != remoteClientId)
                                {
                                    clientControl.UpdateClientId(remoteClientId);
                                }

                                SettedTable.Add(remoteClientId);
                            }
                        }
                        else if (mode == ServerMode)
                        {
                            GetConnection2(datagramPacket.Host, datagramPacket.Port, connectId, remoteClientId);
                        }

                        ConnectionUDP conn = ConnTable[connectId];
                        if (conn != null)
                        {
                            conn.MyRecevier.OnReceivePacket(datagramPacket);
                            if (sType == PacketType.DataPacket)
                            {
                                TrafficEvent e = new TrafficEvent("", Ran.Next(), datagramPacket.Data.Length, TrafficEvent.Download);
                                FireEvent(e);
                            }
                        }
                    }
                }
            });
        }
Пример #22
0
 public AckListTask(ConnectionUDP conn)
 {
     Conn = conn;
 }