private Internals.SocketAddress CheckCacheRemote(ref EndPoint remoteEP, bool isOverwrite)
{
IPEndPoint ipSnapshot = remoteEP as IPEndPoint;
if (ipSnapshot != null)
{
// Snapshot to avoid external tampering and malicious derivations if IPEndPoint.
ipSnapshot = ipSnapshot.Snapshot();
// DualMode: Do the security check on the user input address, but return an IPEndPoint
// mapped to an IPv6 address.
remoteEP = RemapIPEndPoint(ipSnapshot);
}
// This doesn't use SnapshotAndSerialize() because we need the ipSnapshot later.
Internals.SocketAddress socketAddress = CallSerializeCheckDnsEndPoint(remoteEP);
// We remember the first peer with which we have communicated.
Internals.SocketAddress permittedRemoteAddress = _permittedRemoteAddress;
if (permittedRemoteAddress != null && permittedRemoteAddress.Equals(socketAddress))
{
return permittedRemoteAddress;
}
// Cache only the first peer with which we communicated.
if (_permittedRemoteAddress == null || isOverwrite)
{
_permittedRemoteAddress = socketAddress;
}
return socketAddress;
}