58 lines
2.1 KiB
C#
58 lines
2.1 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using Hermes.Objects;
|
|
|
|
namespace Hermes.Selectors
|
|
{
|
|
public class UniqueHighestSpeedSingleRouterSelector : UniqueRouteSelector, IRouteSelector
|
|
{
|
|
#region IRouteSelector Members
|
|
|
|
public Circuit CreateNewCircuit()
|
|
{
|
|
Circuit circuit = new Circuit();
|
|
GetPoolReaderLock();
|
|
{
|
|
lock (UsedRouters)
|
|
{
|
|
IEnumerable<Router> exits = RouterPool.Where(p => p.Flags.Contains("Exit") && !UsedRouters.Contains(p));
|
|
if (exits.Count() == 0)
|
|
exits = RouterPool.Where(p => p.Flags.Contains("Exit"));
|
|
|
|
circuit.AddNextRouter(exits.OrderByDescending(p => p.BandwidthObserved).First());
|
|
UsedRouters.AddRange(circuit.Routers.Values.ToList());
|
|
}
|
|
}
|
|
ReleasePoolReaderLock();
|
|
return circuit;
|
|
}
|
|
|
|
public Circuit CreateNewCircuit(System.Net.IPEndPoint destination)
|
|
{
|
|
Circuit circuit = new Circuit();
|
|
GetPoolReaderLock();
|
|
{
|
|
lock (UsedRouters)
|
|
{
|
|
IEnumerable<Router> exits = RouterPool.Where(p => p.Flags.Contains("Exit") && p.ExitPolicy != null && p.ExitPolicy.IsAcceptableDestination(destination) && !UsedRouters.Contains(p));
|
|
if (exits.Count() == 0)
|
|
{
|
|
exits = RouterPool.Where(p => p.Flags.Contains("Exit") && p.ExitPolicy != null && p.ExitPolicy.IsAcceptableDestination(destination));
|
|
circuit.AddNextRouter(exits.OrderByDescending(p => p.BandwidthObserved).First());
|
|
}
|
|
else
|
|
circuit.AddNextRouter(exits.OrderByDescending(p => p.BandwidthObserved).First());
|
|
|
|
UsedRouters.AddRange(circuit.Routers.Values.ToList());
|
|
}
|
|
}
|
|
ReleasePoolReaderLock();
|
|
return circuit;
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
}
|