private async void StartTrace() { DisplayStatusMessage = false; IsTraceRunning = true; // Measure the time StartTime = DateTime.Now; stopwatch.Start(); dispatcherTimer.Tick += DispatcherTimer_Tick; dispatcherTimer.Interval = new TimeSpan(0, 0, 0, 0, 100); dispatcherTimer.Start(); EndTime = null; TraceResult.Clear(); Hops = 0; cancellationTokenSource = new CancellationTokenSource(); // Try to parse the string into an IP-Address IPAddress.TryParse(Host, out IPAddress ipAddress); try { // Try to resolve the hostname if (ipAddress == null) { IPHostEntry ipHostEntrys = await Dns.GetHostEntryAsync(Host); foreach (IPAddress ip in ipHostEntrys.AddressList) { if (ip.AddressFamily == AddressFamily.InterNetwork && SettingsManager.Current.Traceroute_ResolveHostnamePreferIPv4) { ipAddress = ip; continue; } else if (ip.AddressFamily == AddressFamily.InterNetworkV6 && !SettingsManager.Current.Traceroute_ResolveHostnamePreferIPv4) { ipAddress = ip; continue; } } // Fallback --> If we could not resolve our prefered ip protocol if (ipAddress == null) { foreach (IPAddress ip in ipHostEntrys.AddressList) { ipAddress = ip; continue; } } } TracerouteOptions tracerouteOptions = new TracerouteOptions { Timeout = SettingsManager.Current.Traceroute_Timeout, Buffer = SettingsManager.Current.Traceroute_Buffer, MaximumHops = SettingsManager.Current.Traceroute_MaximumHops, DontFragement = true, ResolveHostname = SettingsManager.Current.Traceroute_ResolveHostname }; Traceroute traceroute = new Traceroute(); traceroute.HopReceived += Traceroute_HopReceived; traceroute.TraceComplete += Traceroute_TraceComplete; traceroute.MaximumHopsReached += Traceroute_MaximumHopsReached; traceroute.UserHasCanceled += Traceroute_UserHasCanceled; traceroute.TraceAsync(ipAddress, tracerouteOptions, cancellationTokenSource.Token); // Add the host to history AddHostToHistory(Host); } catch (SocketException) // This will catch DNS resolve errors { TracerouteFinished(); StatusMessage = string.Format(Application.Current.Resources["String_CouldNotResolveHostnameFor"] as string, Host); DisplayStatusMessage = true; } catch (Exception ex) // This will catch any exception { TracerouteFinished(); StatusMessage = ex.Message; DisplayStatusMessage = true; } }
private async void StartTrace() { DisplayStatusMessage = false; IsTraceRunning = true; // Measure the time StartTime = DateTime.Now; stopwatch.Start(); dispatcherTimer.Tick += DispatcherTimer_Tick; dispatcherTimer.Interval = new TimeSpan(0, 0, 0, 0, 100); dispatcherTimer.Start(); EndTime = null; TraceResult.Clear(); Hops = 0; // Change the tab title (not nice, but it works) Window window = Application.Current.Windows.OfType <Window>().FirstOrDefault(x => x.IsActive); if (window != null) { foreach (TabablzControl tabablzControl in VisualTreeHelper.FindVisualChildren <TabablzControl>(window)) { tabablzControl.Items.OfType <DragablzTabItem>().First(x => x.ID == _tabId).Header = Host; } } cancellationTokenSource = new CancellationTokenSource(); // Try to parse the string into an IP-Address IPAddress.TryParse(Host, out IPAddress ipAddress); try { // Try to resolve the hostname if (ipAddress == null) { IPHostEntry ipHostEntrys = await Dns.GetHostEntryAsync(Host); foreach (IPAddress ip in ipHostEntrys.AddressList) { if (ip.AddressFamily == AddressFamily.InterNetwork && SettingsManager.Current.Traceroute_ResolveHostnamePreferIPv4) { ipAddress = ip; continue; } else if (ip.AddressFamily == AddressFamily.InterNetworkV6 && !SettingsManager.Current.Traceroute_ResolveHostnamePreferIPv4) { ipAddress = ip; continue; } } // Fallback --> If we could not resolve our prefered ip protocol if (ipAddress == null) { foreach (IPAddress ip in ipHostEntrys.AddressList) { ipAddress = ip; continue; } } } TracerouteOptions tracerouteOptions = new TracerouteOptions { Timeout = SettingsManager.Current.Traceroute_Timeout, Buffer = SettingsManager.Current.Traceroute_Buffer, MaximumHops = SettingsManager.Current.Traceroute_MaximumHops, DontFragement = true, ResolveHostname = SettingsManager.Current.Traceroute_ResolveHostname }; Traceroute traceroute = new Traceroute(); traceroute.HopReceived += Traceroute_HopReceived; traceroute.TraceComplete += Traceroute_TraceComplete; traceroute.MaximumHopsReached += Traceroute_MaximumHopsReached; traceroute.UserHasCanceled += Traceroute_UserHasCanceled; traceroute.TraceAsync(ipAddress, tracerouteOptions, cancellationTokenSource.Token); // Add the host to history AddHostToHistory(Host); } catch (SocketException) // This will catch DNS resolve errors { TracerouteFinished(); StatusMessage = string.Format(LocalizationManager.GetStringByKey("String_CouldNotResolveHostnameFor"), Host); DisplayStatusMessage = true; } catch (Exception ex) // This will catch any exception { TracerouteFinished(); StatusMessage = ex.Message; DisplayStatusMessage = true; } }