C#Winformsを使用して、特定のリモートDNS/IPアドレスに接続できるローカルマシンのIPアドレスを自動的に検出しようとしています。
1つのシナリオがVPN上で実行されており、リモートアドレスは10.8.0.1、ローカルアドレスは10.8.0.6、ネットマスクは255.255.255.252です。
ローカルアドレスを反復処理し、リモートとローカルが同じサブネット上にあるかどうかを確認することは明らかに失敗し、他にこれを行う方法がわかりません。
C#Winformsを使用して、特定のリモートDNS/IPアドレスに接続できるローカルマシンのIPアドレスを自動的に検出しようとしています。
1つのシナリオがVPN上で実行されており、リモートアドレスは10.8.0.1、ローカルアドレスは10.8.0.6、ネットマスクは255.255.255.252です。
ローカルアドレスを反復処理し、リモートとローカルが同じサブネット上にあるかどうかを確認することは明らかに失敗し、他にこれを行う方法がわかりません。
ルーティングテーブルは、使用するローカルポートを決定します。route print CLIコマンドを実行する以外に、C#から取得する方法がわかりません。ネットワークが一致する場合はそのポートを使用し、一致しない場合はデフォルトルートを使用します。
探している情報を取得するためのサンプルコードを次に示します。UDPソケットを作成して呼び出しConnect()
(事実上NOOP)、ローカルアドレスをチェックします。
static EndPoint GetLocalEndPointFor(IPAddress remote)
{
using (Socket s = new Socket(remote.AddressFamily,
SocketType.Dgram,
ProtocolType.IP))
{
// Just picked a random port, you could make this application
// specific if you want, but I don't think it really matters
s.Connect(new IPEndPoint(remote, 35353));
return s.LocalEndPoint;
}
}
static void Main(string[] args)
{
IPAddress remoteAddress = IPAddress.Parse("10.8.0.1");
IPEndPoint localEndPoint = GetLocalEndPointFor(remoteAddress) as IPEndPoint;
if (localEndPoint == null)
Console.WriteLine("Couldn't find local address");
else
Console.WriteLine(localEndPoint.Address);
Console.ReadKey();
}
これは事実上この回答の実装ですが、C#であることに注意してください。
http://www.csharp-examples.net/local-ip/
それを試してみてください。