Пример #1
0
        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}");
        }