4

私はマルチホームマシンを持っており、この質問に答える必要があります:

リモートマシンのIPアドレスが与えられた場合、通信に使用するのに適切なローカルインターフェイス。

これはC#で行う必要があります。Win32 SocketとSIO_ROUTING_INTERFACE_QUERYを使用してこのクエリを実行できますが、.net Frameworkのドキュメントを調べても、それに相当するものは見つかりませんでした。

4

2 に答える 2

2

誰かがコードを書くのに十分親切でした。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です。

于 2014-10-28T14:54:48.830 に答える
1

これについては知らなかったので、Visual Studio Objectブラウザーで確認したところ、System.Net.Sockets名前空間からこれを実行できるようです。

その名前空間にはSocket、メソッドを含むクラスがありますIOControl。このメソッドのオーバーロードの1つは、IOControlCode`RoutingInterfaceQuery'のエントリを含む(同じ名前空間内の列挙型)を取ります。

ここで、例としていくつかのコードをまとめてみます。

于 2013-03-25T21:31:49.840 に答える