私はマルチホームマシンを持っており、この質問に答える必要があります:
リモートマシンのIPアドレスが与えられた場合、通信に使用するのに適切なローカルインターフェイス。
これはC#で行う必要があります。Win32 SocketとSIO_ROUTING_INTERFACE_QUERYを使用してこのクエリを実行できますが、.net Frameworkのドキュメントを調べても、それに相当するものは見つかりませんでした。
誰かがコードを書くのに十分親切でした。https: //searchcode.com/codesearch/view/7464800/を参照してください。
private static IPEndPoint QueryRoutingInterface(
Socket socket,
IPEndPoint remoteEndPoint)
{
SocketAddress address = remoteEndPoint.Serialize();
byte[] remoteAddrBytes = new byte[address.Size];
for (int i = 0; i < address.Size; i++) {
remoteAddrBytes[i] = address[i];
}
byte[] outBytes = new byte[remoteAddrBytes.Length];
socket.IOControl(
IOControlCode.RoutingInterfaceQuery,
remoteAddrBytes,
outBytes);
for (int i = 0; i < address.Size; i++) {
address[i] = outBytes[i];
}
EndPoint ep = remoteEndPoint.Create(address);
return (IPEndPoint)ep;
}
これは(例!)のように使用されます:
IPAddress remoteIp = IPAddress.Parse("192.168.1.55");
IpEndPoint remoteEndPoint = new IPEndPoint(remoteIp, 0);
Socket socket = new Socket(
AddressFamily.InterNetwork,
SocketType.Dgram,
ProtocolType.Udp);
IPEndPoint localEndPoint = QueryRoutingInterface(socket, remoteEndPoint );
Console.WriteLine("Local EndPoint is: {0}", localEndPoint);
IpEndPoint
ポートでを指定していますが、ポートは無関係であることに注意してください。また、返されるのIpEndPoint.Port
は常に0
です。
これについては知らなかったので、Visual Studio Objectブラウザーで確認したところ、System.Net.Sockets
名前空間からこれを実行できるようです。
その名前空間にはSocket
、メソッドを含むクラスがありますIOControl
。このメソッドのオーバーロードの1つは、IOControlCode
`RoutingInterfaceQuery'のエントリを含む(同じ名前空間内の列挙型)を取ります。
ここで、例としていくつかのコードをまとめてみます。