Google で同様の質問をいくつか見ましたが、私がやろうとしていることと正確に一致するものはありません。特定のプロセスが開いているときに基本的にユーザーのMTUを下げ、プロセスが閉じられたときにそれを復元する(ゲーム用の)ラグ削減プログラムを作成しています。ただし、MTU はネットワーク アダプター固有の設定であり、一部のユーザーは複数のネットワーク アダプターを接続しています。この目的のために、ゲームで使用されているアダプターもプログラムに検出させ、そのアダプターの MTU のみを変更させるとよいと思いました。
ゲームは一度に1 つのアダプターのみを使用します。
エンドサーバーの IP アドレスはかなり頻繁に変更されるため、ハードコードすることはできません。エンドIPアドレスを知らなくても、他のプロセスが使用しているアダプターを特定する方法が必要なようですが、見つけられないようです。
EDIT : Cicada と Remco のおかげで、問題は解決しました。
Remco がリンクした ManagedIPHelper クラス ( ManagedIpHelper ) を使用し、Cicada のコメントがこの記事 (アクティブなネットワーク インターフェイスの識別)につながりました。
それらをいくつかの(厄介で、ひどく最適化されていない)LINQと組み合わせて、このコードスニペットを取得しました。これは、プロセス名を取得し、使用しているネットワークインターフェイスを返すか、見つからない場合はnullを返します。
private NetworkInterface getAdapterUsedByProcess(string pName)
{
Process[] candidates = Process.GetProcessesByName(pName);
if (candidates.Length == 0)
throw new Exception("Cannot find any running processes with the name " + pName + ".exe");
IPAddress localAddr = null;
using (Process p = candidates[0])
{
TcpTable table = ManagedIpHelper.GetExtendedTcpTable(true);
foreach (TcpRow r in table)
if (r.ProcessId == p.Id)
{
localAddr = r.LocalEndPoint.Address;
break;
}
}
if (localAddr == null)
throw new Exception("No routing information for " + pName + ".exe found.");
foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
{
IPInterfaceProperties ipProps = nic.GetIPProperties();
if (ipProps.UnicastAddresses.Any(new Func<UnicastIPAddressInformation, bool>((u) => { return u.Address.ToString() == localAddr.ToString(); })))
return nic;
}
return null;
}
テストにより、これが完全に機能することが確認されました! どうもありがとう、みんな!
このスニペットを使用している方への補足事項:
- ManagedIpHelper クラスが必要です。
- 状況によっては、アプリが昇格を要求する必要がある場合があります。
- 複数の実行中のプロセス (Chrome を考えてください) は未定義の結果を返します。このコードを複数プロセス候補の状況で使用する場合は、(Process p = Candidate[0])をより具体的なフィルター、つまり PID に基づくフィルターに変更することを強くお勧め します。
- また、新しい例外タイプを実装することもできます。たとえば、「ルーティング情報なし」をよりきれいにキャッチできます。これは、このエラーは、(ターゲット プロセスが接続を開くようにするため) 少し待つだけで修正されることが多いためです。そして再試行します。