以下は、ルーティング テーブルを照会することによって機能します。Socket.Connect
これは、使用するローカル エンドポイントを決定するのと同じ方法です。違い:
- ファイアウォールが原因で失敗することはありません
- リモート エンドポイントが存在しないために失敗することはありません
- ローカルポートを予約しません
- もっと早く
.
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
です。