public string ConfigureNatTraversal(IPAddress ownAddress, int internalPort) { var ip = _upnpDeviceProvider.GetExternalIp(); var allMappings = _upnpDeviceProvider.GetAllMappings(); var existingMapping = allMappings.SingleOrDefault(m => m.PrivatePort == internalPort && m.Description == _description); if (existingMapping?.PrivateIP?.Equals(ownAddress) ?? false) { return($"{existingMapping.PublicIP}:{existingMapping.PublicPort}"); } if (!existingMapping?.PrivateIP?.Equals(ownAddress) ?? false) { _logger.LogError($"The port {internalPort} is in use by another IP: {existingMapping.PrivateIP}"); throw new Exception($"The port {internalPort} is in use by another IP: {existingMapping.PrivateIP}"); } for (var nextPort = 49151; nextPort < 65535; nextPort++) { if (allMappings.Any(m => m.PublicPort == nextPort && !m.PrivateIP.Equals(ownAddress))) { continue; } _upnpDeviceProvider.CreateMapping(internalPort, nextPort, _description); return($"{ip}:{nextPort}"); } _logger.LogError("No available ports found."); throw new Exception("No available ports found."); }
public string ConfigureNatTraversal(IPAddress ownAddress, int internalPort) { var ip = _upnpDeviceProvider.GetExternalIp(); var allMappings = _upnpDeviceProvider.GetAllMappings(); var existingMapping = allMappings.SingleOrDefault(m => m.PrivatePort == internalPort && m.Description == _description); if (existingMapping?.PublicIP?.Equals(ownAddress) ?? false) { return($"{existingMapping.PublicIP}:{existingMapping.PublicPort}"); } if (!existingMapping?.PrivateIP?.Equals(ownAddress) ?? false) { _logger.LogError($"The port {internalPort} is in use by another IP: {existingMapping.PrivateIP}"); throw new Exception($"The port {internalPort} is in use by another IP: {existingMapping.PrivateIP}"); } _upnpDeviceProvider.CreateMapping(internalPort, _externalPort, _description); return($"{ip}:{_externalPort}"); }