在.net中查找IP路由表

本文关键字:路由 IP 查找 net | 更新日期: 2023-09-27 18:06:02

我有一台多主机机器,需要回答这个问题:

给定远程机器的IP地址,哪个本地接口适合用于通信。

这需要在c#中完成。我可以使用Win32 Socket和SIO_ROUTING_INTERFACE_QUERY进行此查询,但在。net框架文档中查找,我没有找到等效的。

在.net中查找IP路由表

有人很好地编写了代码,参见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。此方法的重载之一接受一个IOControlCode(同一命名空间中的enum),其中包含一个' RoutingInterfaceQuery'条目。

我现在试着把一些代码放在一起作为一个例子。