private void CreateAnswerPong(PingMessage message) { PingMessage Answer = new PingMessage(Knot.id, message.IdSource); Answer.DateStart = message.DateStart; Answer.DateEnd = DateTime.Now; MesOut.Push(Answer); }
/// <summary> /// Узел отравляет сообщения в его радиусе /// </summary> public void SentMessage() { //Поиск сообщений в радиусе List <RouterKnot> knots = Logic.Router.Knots.FindAll(k => Math.Pow((k.Knot.CordX - Knot.CordX), 2) + Math.Pow((k.Knot.CordY - Knot.CordY), 2) <= Math.Pow(Knot.Radius / 2, 2) && k.Knot.id != Knot.id ); //Ретрансляция всем узлам в радиусе foreach (RouterKnot knot in knots) { foreach (Message mess in MesOut) { Message ms; if (mess.GetType() == typeof(PingMessage)) { ms = new PingMessage(mess as PingMessage); ms.IdLastNode = Knot.id; } else if (mess.GetType() == typeof(SendMessage)) { ms = new SendMessage(mess as SendMessage); ms.IdLastNode = Knot.id; } else { ms = new ConsoleMessage(mess as ConsoleMessage); ms.IdLastNode = Knot.id; } Logic.w.AddMessage(Knot, knot.Knot); knot.MesIn.Enqueue(ms); } } //Очистка MesOut.Clear(); }
/// <summary> /// Узел обрабатывает сообщения /// </summary> public void ProcessIn() { foreach (Message mess in MesIn) { // Если сообщение ещё не обрабатывалась этим узлом и его TTL > 0 if (!LastsIdMessage.Contains(mess.Id) && mess.TTL > 0) { // Обработка сообщения, где проверяется его TTL и дошло ли оно до цели // Если этот Узел-Роутер является целью сообщения, то оно попадает в консоль. // Но если сообщение Ping, то создаётся новое сообщение PingMessag, только уже // с известным началом и концом пути. Которое отправляется источнику, где уже и выводится ParseMessage(mess); mess.TTL--; LastsIdMessage.Add(mess.Id); MesOut.Push(mess); } } MesIn.Clear(); }
private void CreateTTLMessage(Message message) { ConsoleMessage Answer = new ConsoleMessage("Message cannot be delivered", Knot.id, message.IdSource); MesOut.Push(Answer); }