示例#1
0
        private void FrmNetwork_Load(object sender, EventArgs e)
        {
            ns = new NetworkSpeed();
            ns.NotityInfoEvent += Ns_NotityInfoEvent;
            ns.Start();

            lblPublicIP.Text = NetworkInfo.GetPublicIP();
        }
示例#2
0
        /// <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));
        }
示例#3
0
        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;
            });
        }
示例#4
0
        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));
            }
        }