示例#1
0
 /// <summary>
 /// Подключает пекарни к устройству
 /// </summary>
 /// <param name="device">Устройство</param>
 /// <param name="start_port">начальный порт</param>
 public void Connect(AbstractNetworkDevice device, int start_port)
 {
     for (int i = 0; i < pcs.Count; i++)
     {
         pcs[i].DuplexConnect(0, start_port + i, device);
     }
 }
示例#2
0
        /// <summary>
        /// Подключает пекарни к устройству
        /// </summary>
        /// <param name="device">Устройство</param>
        /// <param name="ports">Список портов</param>
        public void Connect(AbstractNetworkDevice device, params int[] ports)
        {
            if (ports.Length != pcs.Count)
            {
                throw new ArgumentException("Number of ports to connect must be equal to PCs count");
            }

            for (int i = 0; i < pcs.Count; i++)
            {
                pcs[i].DuplexConnect(0, ports[i], device);
            }
        }
示例#3
0
        //Сохраняет соединения
        private void make_connections(AbstractNetworkDevice device)
        {
            var connections = device.Connections;
            var list        = new List <UserControl>();

            foreach (var connection in connections)
            {
                list.Add(connection.Value);
            }

            this.connections.Add(device, list);
        }
示例#4
0
        /*
         * Рассылает пакет на все порты, кроме того, на который он пришел
         */
        public override void ProcessPackage(Package package, AbstractNetworkDevice sender)
        {
            int i = 0;

            foreach (var device in ConnectedDevices)
            {
                if (!device.Value.Equals(sender))
                {
                    Package pckg = i == (ConnectedDevices.Count - 2) ? package : (Package)package.Clone();
                    i++;
                    send(device.Key, pckg);
                }
            }
        }
示例#5
0
        /// <summary>
        /// Подключает другое устройство к этому устройству
        /// </summary>
        /// <param name="port_number">Номер порта, к которому подключается</param>
        /// <param name="device">Подключаемое устройство</param>
        /// <returns></returns>
        public void Connect(int port_number, AbstractNetworkDevice device)
        {
            if ((port_number < 0) || (port_number >= InterfacesCount))
            {
                throw new NoSuchInterfaceException(port_number);
            }

            if (ConnectedDevices.ContainsKey(port_number))
            {
                throw new InterfaceAlreadyConnectedException();
            }

            ConnectedDevices.Add(port_number, device);
        }
示例#6
0
        /*
         * Если адрес получителя совпадает - то принимаем пакет,
         * иначе - откланяет
         */
        public override void ProcessPackage(Package package, AbstractNetworkDevice sender)
        {
            string stage;

            //Адресован ли пакет нам
            if (package.EndIP.Peek().Equals(InterfaceAdresses[0].IP))
            {
                package.PackageState = Package.State.RECEIVED;
                stage = Name + " (" + InterfaceAdresses[0] + ") received package " + package + " from " + package.StartIP;
            }
            else
            {
                package.PackageState = Package.State.REJECTED;
                stage = Name + " (" + InterfaceAdresses[0] + ") rejected package " + package;
            }

            Logger.WriteLine(stage);
            package.AddStage(stage);
            PackageManager.AddPackage(package);
        }
示例#7
0
 /// <summary>
 /// Обработка пакета
 /// </summary>
 /// <param name="package"></param>
 public virtual void ProcessPackage(Package package, AbstractNetworkDevice sender)
 {
 }
示例#8
0
 /// <summary>
 /// "Событие" получения пакета
 /// </summary>
 /// <param name="package">Входящий пакет</param>
 public void ReceivePacakge(Package package, AbstractNetworkDevice sender)
 {
     ProcessPackage(package, sender);
 }
示例#9
0
        /////////////////////////////////////////////////////////////////////////////////////////////////
        /// СЕТЕВОЕ ПОВЕДЕНИЕ
        /////////////////////////////////////////////////////////////////////////////////////////////////

        /// <summary>
        /// Подключает другое устройство к этому устройству
        /// </summary>
        /// <param name="port_number">Номер порта, к которму подключается</param>
        /// <param name="other_port_number">Номер порта на другом устройстве, которым оно полкючается</param>
        /// <param name="device">Подключаемое устройство</param>
        public void DuplexConnect(int port_number, int other_port_number, AbstractNetworkDevice device)
        {
            Connect(port_number, device);
            device.Connect(other_port_number, this);
        }
示例#10
0
 public MovingPackage(AbstractNetworkDevice device1, AbstractNetworkDevice device2, long end_time)
 {
     EndDevice = device2;
 }
示例#11
0
        public override void ProcessPackage(Package package, AbstractNetworkDevice sender)
        {
            //Порт, на который пришел пакет
            int    port = ConnectedDevices.First(x => x.Value == sender).Key;
            string stage;

            //Адресован ли пакет нам
            if (package.EndIP.Peek().Equals(InterfaceAdresses[port].IP))
            {
                //Убираем верхний адрес в пакете
                //Если ничего нет больше - пакет адресован роутеру,
                //если есть - надо слать дальше

                package.EndIP.Pop();
                if (package.EndIP.Count == 0)
                {
                    package.EndIP.Push(InterfaceAdresses[port].IP);

                    stage = Name + " (" + InterfaceAdresses[port] + ") received package " + package + "from " + package.StartIP;
                    Logger.WriteLine(stage);
                    package.AddStage(stage);
                    package.PackageState = Package.State.RECEIVED;
                    PackageManager.AddPackage(package);
                    return;
                }

                //Пересылка дальше
                //проверка по PROXY-таблице
                bool ispass = is_pass(package);
                if (!ispass)
                {
                    stage = Name + " (" + InterfaceAdresses[port] + ") DENIED package " + package;
                    Logger.WriteLine(stage);
                    package.AddStage(stage);
                    package.PackageState = Package.State.DENIED;
                    PackageManager.AddPackage(package);
                    return;
                }


                //Проверка по таблице маршрутизации
                Route route = get_route(package.EndIP.Peek());
                if (route == null)
                {
                    stage = Name + " (" + InterfaceAdresses[port] + ") DON'T find route for package " + package;
                    Logger.WriteLine(stage);
                    package.AddStage(stage);
                    package.PackageState = Package.State.NO_ROUTE;
                    PackageManager.AddPackage(package);

                    return;
                }


                if (route.NextRouter != null)
                {
                    package.EndIP.Push(route.NextRouter);
                }


                send(package, route.PortNo);
            }
            else
            {
                package.PackageState = Package.State.REJECTED;
                stage = Name + " (" + InterfaceAdresses[0] + ") rejected package " + package;

                Logger.WriteLine(stage);
                package.AddStage(stage);
                PackageManager.AddPackage(package);
            }
        }