/// <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); } }
/// <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); } }
//Сохраняет соединения 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); }
/* * Рассылает пакет на все порты, кроме того, на который он пришел */ 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); } } }
/// <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); }
/* * Если адрес получителя совпадает - то принимаем пакет, * иначе - откланяет */ 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); }
/// <summary> /// Обработка пакета /// </summary> /// <param name="package"></param> public virtual void ProcessPackage(Package package, AbstractNetworkDevice sender) { }
/// <summary> /// "Событие" получения пакета /// </summary> /// <param name="package">Входящий пакет</param> public void ReceivePacakge(Package package, AbstractNetworkDevice sender) { ProcessPackage(package, sender); }
///////////////////////////////////////////////////////////////////////////////////////////////// /// СЕТЕВОЕ ПОВЕДЕНИЕ ///////////////////////////////////////////////////////////////////////////////////////////////// /// <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); }
public MovingPackage(AbstractNetworkDevice device1, AbstractNetworkDevice device2, long end_time) { EndDevice = device2; }
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); } }