IP routing table lookup in .net

前端 未结 2 514
悲哀的现实
悲哀的现实 2021-01-06 10:14

I have a multi-homed machine and need to answer this question:

Given an IP address of the remote machine, which local interface is appropriate to use for communicati

相关标签:
2条回答
  • 2021-01-06 10:55

    I didn't know about this, so just had a look in the Visual Studio Object browser, and it looks like you can do this from the System.Net.Sockets namespace.

    In that namespace is a Socket class which contains a method IOControl. One of the overloads for this method takes an IOControlCode (enum in the same namespace) which contains an entry for `RoutingInterfaceQuery'.

    I'll try and put some code together as an example now.

    0 讨论(0)
  • 2021-01-06 11:13

    Someone was nice enough to writez the code, see 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;
    }
    

    which is used like (example!):

    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);
    

    Please note that although one is specifying an IpEndPoint with a Port, the port is irrelevant. Also, the returned IpEndPoint.Port is always 0.

    0 讨论(0)
提交回复
热议问题