private IEnumerable<MessageVersion1> ApplyMessageBuffer(MessageVersion1 message, out Neighbor neighbor) { neighbor = null; if (!CheckNeighbor(message)) return null; neighbor = neighbors.Single(n => n.Identifier.Equals(message.PeerId)); if (message.PacketIndex <= neighbor.IncomingPacketIndex) return null; if (message.PacketIndex > neighbor.IncomingPacketIndex + 1) { lock (neighbor) neighbor.AddMessageToBuffer(message); return null; } lock (neighbor) if (neighbor.HasBufferedMessages) { neighbor.AddMessageToBuffer(message); neighbor.IncomingPacketIndex += (ulong)neighbor.BufferedMessages.Count; return neighbor.RemoveMessagesFromBuffer(); } else { neighbor.IncomingPacketIndex++; return new[] { message }; } }
void RemoveNeighbor(PeerIdentifier peerIdentifier) { lock (neighbors) { var neighbor = new Neighbor { Identifier = peerIdentifier }; if (neighbors.Contains(neighbor)) neighbors.Remove(neighbor); } }
void AddNeighbor(PeerIdentifier peerIdentifier, IPEndPoint endPoint) { lock (neighbors) { var neighbor = new Neighbor { Identifier = peerIdentifier }; if (!neighbors.Contains(neighbor)) { neighbor.IpEndPoints = new[] { endPoint }; neighbors.Add(neighbor); } else { var ne = neighbors.Find(n => n.Equals(neighbor)); ne.IpEndPoints = ne.IpEndPoints.Concat(new[] { endPoint }); } } }