4

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

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

这需要在 C# 中完成。我可以使用 Win32 Socket 和 SIO_ROUTING_INTERFACE_QUERY 进行此查询,但在 .net 框架文档中四处寻找我还没有找到它的等价物。

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 对象浏览器,看起来您可以从System.Net.Sockets命名空间执行此操作。

在该命名空间中是一个Socket包含方法的类IOControl。此方法的重载之一采用IOControlCode(同一命名空间中的枚举),其中包含“RoutingInterfaceQuery”的条目。

我现在尝试将一些代码放在一起作为示例。

于 2013-03-25T21:31:49.840 回答