public override async Task <IEnumerable <Mapping> > GetAllMappingsAsync() { var index = 0; var mappings = new List <Mapping>(); NatDiscoverer.TraceSource.LogInfo("GetAllMappingsAsync - Getting all mappings"); while (true) { try { var message = new GetGenericPortMappingEntry(index++); var responseData = await _soapClient .InvokeAsync("GetGenericPortMappingEntry", message.ToXml()) .TimeoutAfter(TimeSpan.FromSeconds(4)); var responseMessage = new GetPortMappingEntryResponseMessage(responseData, DeviceInfo.ServiceType, true); IPAddress internalClientIp; if (!IPAddress.TryParse(responseMessage.InternalClient, out internalClientIp)) { NatDiscoverer.TraceSource.LogWarn("InternalClient is not an IP address. Mapping ignored!"); continue; } var mapping = new Mapping(responseMessage.Protocol , internalClientIp , responseMessage.InternalPort , responseMessage.ExternalPort , responseMessage.LeaseDuration , responseMessage.PortMappingDescription); mappings.Add(mapping); } catch (MappingException e) { // there are no more mappings if (e.ErrorCode == UpnpConstants.SpecifiedArrayIndexInvalid || e.ErrorCode == UpnpConstants.NoSuchEntryInArray // DD-WRT Linux base router (and others probably) fails with 402-InvalidArgument when index is out of range || e.ErrorCode == UpnpConstants.InvalidArguments // LINKSYS WRT1900AC AC1900 it returns errocode 501-PAL_UPNP_SOAP_E_ACTION_FAILED || e.ErrorCode == UpnpConstants.ActionFailed // LINKSYS EA8500 returns error code 601 || e.ErrorCode == UpnpConstants.ArgumentValueOutOfRange) { NatDiscoverer.TraceSource.LogWarn("Router failed with {0}-{1}. No more mappings is assumed.", e.ErrorCode, e.ErrorText); break; } throw; } } return(mappings.ToArray()); }
public override async Task <IEnumerable <Mapping> > GetAllMappingsAsync() { var index = 0; var mappings = new List <Mapping>(); while (true) { try { var message = new GetGenericPortMappingEntry(index); var responseData = await _soapClient .InvokeAsync("GetGenericPortMappingEntry", message.ToXml()) .TimeoutAfter(TimeSpan.FromSeconds(4)); var responseMessage = new GetPortMappingEntryResponseMessage(responseData, DeviceInfo.ServiceType, true); var mapping = new Mapping(responseMessage.Protocol , IPAddress.Parse(responseMessage.InternalClient) , responseMessage.InternalPort , responseMessage.ExternalPort , responseMessage.LeaseDuration , responseMessage.PortMappingDescription); mappings.Add(mapping); index++; } catch (MappingException e) { if (e.ErrorCode == UpnpConstants.SpecifiedArrayIndexInvalid) { break; // there are no more mappings } throw; } } return(mappings.ToArray()); }
public void GetGenericMappingAsync(int index, List <Mapping> mappings, TaskCompletionSource <IEnumerable <Mapping> > taskCompletionSource) { var message = new GetGenericPortMappingEntry(index); _soapClient .InvokeAsync("GetGenericPortMappingEntry", message.ToXml()) .TimeoutAfter(TimeSpan.FromSeconds(4)) .ContinueWith(task => { if (!task.IsFaulted) { var responseData = task.Result; var responseMessage = new GetPortMappingEntryResponseMessage(responseData, DeviceInfo.ServiceType, true); IPAddress internalClientIp; if (!IPAddress.TryParse(responseMessage.InternalClient, out internalClientIp)) { NatDiscoverer.TraceSource.LogWarn("InternalClient is not an IP address. Mapping ignored!"); } else { var mapping = new Mapping(responseMessage.Protocol , internalClientIp , responseMessage.InternalPort , responseMessage.ExternalPort , responseMessage.LeaseDuration , responseMessage.PortMappingDescription); mappings.Add(mapping); } GetGenericMappingAsync(index + 1, mappings, taskCompletionSource); } else { MappingException e = task.Exception.InnerException as MappingException; if (e == null) { throw task.Exception.InnerException; } if (e.ErrorCode == UpnpConstants.SpecifiedArrayIndexInvalid || e.ErrorCode == UpnpConstants.NoSuchEntryInArray) { // there are no more mappings taskCompletionSource.SetResult(mappings); return; } // DD-WRT Linux base router (and others probably) fails with 402-InvalidArgument when index is out of range if (e.ErrorCode == UpnpConstants.InvalidArguments) { NatDiscoverer.TraceSource.LogWarn("Router failed with 402-InvalidArgument. No more mappings is assumed."); taskCompletionSource.SetResult(mappings); return; } throw task.Exception.InnerException; } }); }
public override async Task<IEnumerable<Mapping>> GetAllMappingsAsync() { var index = 0; var mappings = new List<Mapping>(); NatDiscoverer.TraceSource.LogInfo("GetAllMappingsAsync - Getting all mappings"); while (true) { try { var message = new GetGenericPortMappingEntry(index++); var responseData = await _soapClient .InvokeAsync("GetGenericPortMappingEntry", message.ToXml()) .TimeoutAfter(TimeSpan.FromSeconds(4)); var responseMessage = new GetPortMappingEntryResponseMessage(responseData, DeviceInfo.ServiceType, true); IPAddress internalClientIp; if(!IPAddress.TryParse(responseMessage.InternalClient, out internalClientIp)) { NatDiscoverer.TraceSource.LogWarn("InternalClient is not an IP address. Mapping ignored!"); continue; } var mapping = new Mapping(responseMessage.Protocol , internalClientIp , responseMessage.InternalPort , responseMessage.ExternalPort , responseMessage.LeaseDuration , responseMessage.PortMappingDescription); mappings.Add(mapping); } catch (MappingException e) { // there are no more mappings if (e.ErrorCode == UpnpConstants.SpecifiedArrayIndexInvalid || e.ErrorCode == UpnpConstants.NoSuchEntryInArray // DD-WRT Linux base router (and others probably) fails with 402-InvalidArgument when index is out of range || e.ErrorCode == UpnpConstants.InvalidArguments // LINKSYS WRT1900AC AC1900 it returns errocode 501-PAL_UPNP_SOAP_E_ACTION_FAILED || e.ErrorCode == UpnpConstants.ActionFailed) { NatDiscoverer.TraceSource.LogWarn("Router failed with {0}-{1}. No more mappings is assumed.", e.ErrorCode, e.ErrorText); break; } throw; } } return mappings.ToArray(); }
public override async Task<IEnumerable<Mapping>> GetAllMappingsAsync() { var index = 0; var mappings = new List<Mapping>(); while (true) { try { var message = new GetGenericPortMappingEntry(index); var responseData = await _soapClient .InvokeAsync("GetGenericPortMappingEntry", message.ToXml()) .TimeoutAfter(TimeSpan.FromSeconds(4)); var responseMessage = new GetPortMappingEntryResponseMessage(responseData, DeviceInfo.ServiceType, true); var mapping = new Mapping(responseMessage.Protocol , IPAddress.Parse(responseMessage.InternalClient) , responseMessage.InternalPort , responseMessage.ExternalPort , responseMessage.LeaseDuration , responseMessage.PortMappingDescription); mappings.Add(mapping); index++; } catch (MappingException e) { if (e.ErrorCode == UpnpConstants.SpecifiedArrayIndexInvalid) break; // there are no more mappings throw; } } return mappings.ToArray(); }
public void GetGenericMappingAsync(int index, List<Mapping> mappings, TaskCompletionSource<IEnumerable<Mapping>> taskCompletionSource) { var message = new GetGenericPortMappingEntry(index); _soapClient .InvokeAsync("GetGenericPortMappingEntry", message.ToXml()) .TimeoutAfter(TimeSpan.FromSeconds(4)) .ContinueWith(task => { if (!task.IsFaulted) { var responseData = task.Result; var responseMessage = new GetPortMappingEntryResponseMessage(responseData, DeviceInfo.ServiceType, true); IPAddress internalClientIp; if (!IPAddress.TryParse(responseMessage.InternalClient, out internalClientIp)) { NatDiscoverer.TraceSource.LogWarn("InternalClient is not an IP address. Mapping ignored!"); } else { var mapping = new Mapping(responseMessage.Protocol , internalClientIp , responseMessage.InternalPort , responseMessage.ExternalPort , responseMessage.LeaseDuration , responseMessage.PortMappingDescription); mappings.Add(mapping); } GetGenericMappingAsync(index + 1, mappings, taskCompletionSource); } else { MappingException e = task.Exception.InnerException as MappingException; if (e == null) { throw task.Exception.InnerException; } if (e.ErrorCode == UpnpConstants.SpecifiedArrayIndexInvalid || e.ErrorCode == UpnpConstants.NoSuchEntryInArray) { // there are no more mappings taskCompletionSource.SetResult(mappings); return; } // DD-WRT Linux base router (and others probably) fails with 402-InvalidArgument when index is out of range if (e.ErrorCode == UpnpConstants.InvalidArguments) { NatDiscoverer.TraceSource.LogWarn("Router failed with 402-InvalidArgument. No more mappings is assumed."); taskCompletionSource.SetResult(mappings); return; } throw task.Exception.InnerException; } }); }