在.net中查找IP路由表
本文关键字:路由 IP 查找 net | 更新日期: 2023-09-27 18:06:02
我有一台多主机机器,需要回答这个问题:
给定远程机器的IP地址,哪个本地接口适合用于通信。
这需要在c#中完成。我可以使用Win32 Socket和SIO_ROUTING_INTERFACE_QUERY进行此查询,但在。net框架文档中查找,我没有找到等效的。
有人很好地编写了代码,参见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'条目。
我现在试着把一些代码放在一起作为一个例子。