private void FrmNetwork_Load(object sender, EventArgs e) { ns = new NetworkSpeed(); ns.NotityInfoEvent += Ns_NotityInfoEvent; ns.Start(); lblPublicIP.Text = NetworkInfo.GetPublicIP(); }
/// <summary> /// https://www.incapsula.com/blog/mtu-mss-explained.html /// https://blog.thousandeyes.com/a-very-simple-model-for-tcp-throughput/ /// https://www.netcraftsmen.com/tcp-performance-and-the-mathis-equation/ /// Paper = PTP-Mesh /// //Loss Percentage (p) = 10^-4 /// MaxTrasmissionUnit (MTU)= 1460 byte /// MaxSegmentsize = MTU + 40 = 1500 byte /// TCPHeader = 24 byte /// MSS = 1524 /// RTT = 1 m sec /// C = 1.22 = root 1.5 /// T = MSS*C/RTT*root(p) /// </summary> /// <param name="size"></param> /// <param name="speed"></param> /// <returns></returns> public static int GetNetworkDelay(double size, bool networkDelay, NetworkSpeed speed = NetworkSpeed.HundredG) { if (!networkDelay) { return(0); } var p = 0.0001; var mss = 1524; var RTT = 400 / Math.Pow(10, 6); var c = Math.Sqrt(1.5); var throuputinByte = mss * c / (RTT * Math.Sqrt(p)); //var T = throuputinByte / (1024 * 1024); var sizeinByte = size * 1024 * 1024; var noofPackets = Math.Ceiling(sizeinByte / 1460.0); var finalSize = sizeinByte + 64 * noofPackets; var delay = finalSize / throuputinByte; //delay *= 10; return(Convert.ToInt32(delay)); }
public static void NetworkSpeedWatch() { Observable.Interval(TimeSpan.FromSeconds(1)).Select(x => { NetworkInterface[] adapters = NetworkInterface.GetAllNetworkInterfaces(); long rece = 0, sent = 0, speed = 0; foreach (NetworkInterface adapter in adapters) { IPInterfaceProperties properties = adapter.GetIPProperties(); if (!properties.GatewayAddresses.Any()) { continue; } IPv4InterfaceStatistics stats = adapter.GetIPv4Statistics(); rece += stats.BytesReceived * 8; sent += stats.BytesSent * 8; speed += adapter.Speed; } return(received: rece, sent: sent, speed: speed); }) .Buffer(2, 1) .ObserveOn(Scheduler.Default) .Subscribe(x => { NetworkSpeed speed = new NetworkSpeed(); speed.In = (x[1].received - x[0].received); speed.Out = (x[1].sent - x[0].sent); speed.MaxIn = x[0].speed; speed.MaxOut = x[0].speed; SystemController.Speed = speed; }); }
public virtual async Task Download(string mangaFolder = null) { if (!this.NeedUpdate) { return; } try { await this.Refresh().ConfigureAwait(false); if (Cover == null) { Cover = (await Parser.GetPreviews(this).ConfigureAwait(false)).FirstOrDefault(); } if (mangaFolder == null) { mangaFolder = this.GetAbsoluteFolderPath(); } await this.UpdateContent().ConfigureAwait(false); } catch (System.Exception ex) { Log.Exception(ex, $"Не удалось получить информацию о манге {Name} ({Uri})"); } try { this.ActiveVolumes = this.Volumes; this.ActiveChapters = this.Chapters; this.ActivePages = this.Pages; if (this.Setting.OnlyUpdate) { History.FilterActiveElements(this); } if (!this.ActiveChapters.Any() && !this.ActiveVolumes.Any() && !this.ActivePages.Any()) { using (var context = Repository.GetEntityContext()) await context.Save(this).ConfigureAwait(false); return; } } catch (System.Exception ex) { Log.Exception(ex, $"Не удалось найти историю о манге {Name} ({Uri})"); return; } Log.AddFormat("Download start '{0}'.", this.Name); // Формируем путь к главе вида Папка_манги\Том_001\Глава_0001 try { using (FolderNamingStrategies.BlockStrategy(this)) using (new Timer(state => OnPropertyChanged(nameof(Downloaded)), null, 750, 750)) { NetworkSpeed.Clear(); var plugin = Plugin; if (!Directory.Exists(mangaFolder)) { Directory.CreateDirectory(mangaFolder); } var tasks = this.ActiveVolumes.Select( v => { v.OnlyUpdate = this.Setting.OnlyUpdate; return(v.Download(mangaFolder).ContinueWith(t => { if (t.Exception != null) { Log.Exception(t.Exception, v.Uri?.ToString()); } if (plugin.HistoryType == HistoryType.Chapter) { AddToHistory(v.InDownloading.Where(c => c.IsDownloaded).ToArray()); } if (plugin.HistoryType == HistoryType.Page) { AddToHistory(v.InDownloading.SelectMany(ch => ch.InDownloading).Where(p => p.IsDownloaded).ToArray()); } })); }); var chTasks = this.ActiveChapters.Select( ch => { ch.OnlyUpdate = this.Setting.OnlyUpdate; return(ch.Download(mangaFolder).ContinueWith(t => { if (t.Exception != null) { Log.Exception(t.Exception, ch.Uri?.ToString()); } if (ch.IsDownloaded && plugin.HistoryType == HistoryType.Chapter) { AddToHistory(ch); } if (plugin.HistoryType == HistoryType.Page) { AddToHistory(ch.InDownloading.Where(c => c.IsDownloaded).ToArray()); } })); }); var pTasks = this.ActivePages.Select( p => { return(p.Download(mangaFolder).ContinueWith(t => { if (t.Exception != null) { Log.Exception(t.Exception, $"Не удалось скачать изображение {p.ImageLink} со страницы {p.Uri}"); } if (p.IsDownloaded && plugin.HistoryType == HistoryType.Page) { AddToHistory(p); } })); }); await Task.WhenAll(tasks.Concat(chTasks).Concat(pTasks).ToArray()).ConfigureAwait(false); this.DownloadedAt = DateTime.Now; } using (var context = Repository.GetEntityContext()) await context.Save(this).ConfigureAwait(false); Log.AddFormat("Download end '{0}'.", this.Name); } catch (AggregateException ae) { foreach (var ex in ae.Flatten().InnerExceptions) { Log.Exception(ex); } } catch (System.Exception ex) { Log.Exception(ex); } finally { NetworkSpeed.Clear(); OnPropertyChanged(nameof(Downloaded)); } }