我有一台多宿主的机器,需要回答这个问题:
给定远程机器的IP地址,哪个本地接口适合用于通信。
这需要在C#中完成。我可以使用Win32 Socket和SIO_ROUTING_INTERFACE_QUERY进行此查询,但在.net框架文档中查看我还没有找到它的等价物。
答案 0 :(得分: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
。
答案 1 :(得分:1)
我不知道这个,所以只是看看Visual Studio对象浏览器,看起来你可以从System.Net.Sockets
名称空间执行此操作。
在该命名空间中是一个Socket
类,其中包含方法IOControl
。此方法的一个重载需要IOControlCode
(同一命名空间中的枚举),其中包含`RoutingInterfaceQuery'的条目。
我现在尝试将一些代码放在一起作为例子。