一般的に言えば、これはそれほど簡単ではありません。
帯域幅の検出
.NET フレームワークは、ネットワーク アダプターのパフォーマンスに関する情報を提供するクラスを提供しますが、私の知る限り、それらはネットワーク カード自体の技術仕様のみを考慮し、接続の帯域幅は考慮しません。ただし、これで目的には十分かもしれません。
接続の帯域幅を検出する場合は、ネットワーク アダプターとその機能だけでなく、接続のプロパティやインフラストラクチャ全体 (ルーティングまたはスイッチング ハードウェア、ケーブル、トラフィック量など) も監視する必要があります。 、使用率など)。このような監視を実行する、nagios などの強力なフレームワークがあります。
最初に、TCP 接続の遅延を分析したり、測定のために ICMP エコー (ping) を利用したりすることから始めることができますが、これは簡単な作業ではないことに注意してください。
ルーティング
C# ではカーネル モードまたはドライバー コードを記述できないため、トラフィックを監視し、WinPcap などのライブラリを使用してネットワーク パケットを正しいインターフェイスに送信することにより、"ユーザーランド" ルーティングを実行する必要があります。(各パケットを個別にルーティングしたいと書いたので、システムルートを変更するだけでは不十分だと思います)。
C# でこのようなタスクを実行するためのクラスとインフラストラクチャを提供するeEx Network Libraryというライブラリが既に存在します。開始点として使用できるルーティングの例もあります。最も適したものに応じて、クラス Router または DirectInterfaceIO から継承することにより、カスタム ルーターを作成できます。
上記の例の Router クラスを置き換えることができる例を次に示します。
//A simple, custom router
public class CustomRouter : DirectInterfaceIOHandler
{
//Is called for each frame - place your logic here.
protected override void HandleTraffic(Frame fInputFrame)
{
//Get the IP frame
//IPv4Frame ipv4frame = GetIPv4Frame(fInputFrame);
IPFrame ipframe = GetIPFrame(fInputFrame);
if (ipframe != null)
{
//Iterate over all interfaces.
foreach (IPInterface ipInterface in lInterfaces)
{
//Adjust this condition to check whether ipInterface is the correct interface for this frame
if (true)
{
//With this overload of send, the interface handles hardware addressing.
ipInterface.Send(fInputFrame, ipframe.DestinationAddress);
}
}
}
}
}