Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检测internet连接是否繁忙_C#_.net_Language Agnostic_Network Utilization - Fatal编程技术网

C# 检测internet连接是否繁忙

C# 检测internet连接是否繁忙,c#,.net,language-agnostic,network-utilization,C#,.net,Language Agnostic,Network Utilization,我们正在开发一个应用程序,将安装在PC上,它将执行一些后台上传和下载到/从我们的服务器。其中一项要求是检测internet连接当前是否繁忙(例如,使用率超过50%),如果繁忙,则需要退出并重试。其主要原因是,如果用户处于游戏中间,观看在线电影或积极下载文件,则确保应用程序不干扰用户体验。 在对谷歌进行了很多思考和研究之后,当然,我仍然没有找到一个好的方法来实现这一点,所以决定把它扔到这里该应用程序是用C#和.NET 4.0实现的,我正在寻找所有形式的响应-用C#或其他语言实现,伪逻辑或如何实现的

我们正在开发一个应用程序,将安装在PC上,它将执行一些后台上传和下载到/从我们的服务器。其中一项要求是检测internet连接当前是否繁忙(例如,使用率超过50%),如果繁忙,则需要退出并重试。其主要原因是,如果用户处于游戏中间,观看在线电影或积极下载文件

,则确保应用程序不干扰用户体验。 在对谷歌进行了很多思考和研究之后,当然,我仍然没有找到一个好的方法来实现这一点,所以决定把它扔到这里该应用程序是用C#和.NET 4.0实现的,我正在寻找所有形式的响应-用C#或其他语言实现,伪逻辑或如何实现的方法-在本地PC上以足够高的精度测量互联网流量利用率。

为了避免重复工作,到目前为止,我已经尝试了这些方法(以及为什么它们不合适)

  • 使用WMI获取网络统计信息。此后,大多数SO帖子和解决方案都将此作为一种方法,但它不符合我们的要求,因为根据网络接口容量(例如1GB以太网卡)测量发送/接收的字节的利用率可以很好地测量LAN流量,但不能测量internet流量(实际互联网带宽可能只有8Mbps)
  • 使用.NET网络信息统计或性能计数器产生与上述类似的读数,因此具有相同的缺点
  • 使用ICMP(Ping)和测量RTT。有人建议,对于繁忙的网络,400ms RTT被认为是缓慢且良好的指示,但我被告知,使用调制解调器的用户(是的,我们必须支持),使用反向代理或微波链路通常会得到高于此值的Ping,因此不是一个好的测量
  • 开始下载一个已知的文件并测量速度-这本身会产生我们试图避免的流量,而且如果经常进行此检查,我们的应用程序最终会产生大量的互联网流量-这同样不理想
  • MOD:使用BITS-此服务可以在用户pc上禁用,需要更改组策略,并假定服务器为IIS(具有自定义配置),在我们的情况下,我们的服务器不是IIS

就是这样,我很困惑,想寻求一些建议。我突出显示了问题文本,这样你们就不会在阅读这篇文章时迷路,想知道问题是什么。谢谢。

您可以使用UPnP查询路由器,并检索通过网络发送和接收的字节数。您可以继续在路由器上检查此值以确定活动是什么。遗憾的是,此功能似乎没有很好的文档记录,但可以在C#应用程序中实现UPnP通信功能。您需要使用UDP查询路由器(UPnP发现),找到设备后,查询其功能,然后使用WebClient(TCP)查询Internet网关设备发送和接收的数据包数

您是否考虑过使用。它已被设计用于此工作:

后台智能传输服务(BITS)在客户端和服务器之间传输文件(下载或上载),并提供与传输相关的进度信息。您还可以从对等方下载文件

以及

保留其他网络应用程序的响应能力


我不确定它是否有托管接口(我可以看到对Powershell cmdlet的引用),因此您可能必须使用COM interop来使用它。

假设您的目标是Windows PC(正如您所说,您是在C#中开发的),您看过后台智能传输服务吗


有一些例子说明了如何使用MSDN和其他地方的C#连接到它,例如

正确的解决方案是路由器上的QoS。遗憾的是,大多数消费者路由器都很糟糕。这似乎是一个常见的问题,但似乎没有常见的解决方案:(因为这个问题不可能在PC层面上解决。你的软件无法知道其他人使用同一路由器产生了多少流量。我非常同意你的看法。我想在放弃之前,我应该看看其他人是否也有同样的想法,或者过去是否有聪明的想法解决了这个问题,并愿意与大家分享继承人的经验。一个更明智的方法不是有一个基本的参考值,比如超时值,如果你的上传或下载开始需要超过N秒,你会限制它,然后在N秒后全速重试吗?谢谢你的回复。这种方法能适用于所有受支持的Win操作系统和大多数路由器吗?同样适用我收到了发送和接收的数据包,如何决定使用率(例如在我的例子中,50%是考虑占线),是的,这种方法将与大多数的消费者路由器一起工作,但不是大多数业务的(UPnP在企业路由器上被默认禁用)。。请阅读本文-了解UPnP的介绍。此示例用于端口转发,但您可以使用路由器提供的URL查找其其他功能(大多数路由器的带宽功能通常相同).+1感谢您提供的示例和信息。一旦我们收到了您代码示例中发送/接收的字节,我仍然不清楚您如何确定利用率百分比?@FadrianSudaman您需要让用户选择他们的带宽量,就像免费下载管理器那样(他们询问用户有多少带宽可用),或者您可以使用第三方站点API来运行速度测试。是的,我有,但不幸的是,由于多种原因,它不能满足我们的需要:BITS服务可能被禁用,它需要更改组策略和服务器端点(假定为IIS)并且需要配置-在我们的情况下,服务器不是IIS。建议+1。感谢您的反馈。是的,我有 Code for a UPnP library:

using System;
using System.Collections.Generic;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.Xml;
using System.IO;
namespace UPNPLib
{
    public class RouterElement
    {
        public RouterElement()
        {
        }
        public override string ToString()
        {
            return Name;
        }
        public List children = new List();
        public RouterElement parent;
        public string Name;
        public string Value;
        public RouterElement this[string name] {
            get
            {
                foreach (RouterElement et in children)
                {
                    if (et.Name.ToLower().Contains(name.ToLower()))
                    {
                        return et;
                    }
                }
                foreach (RouterElement et in children)
                {
                    Console.WriteLine(et.Name);
                }
                throw new KeyNotFoundException("Unable to find the specified entry");
            }
    }
        public RouterElement(XmlNode node, RouterElement _parent)
        {

            Name = node.Name;
            if (node.ChildNodes.Count 
        /// Gets the root URL of the device
        /// 
        /// 
        public static string GetRootUrl()
        {
            StringBuilder mbuilder = new StringBuilder();
            mbuilder.Append("M-SEARCH * HTTP/1.1\r\n");
            mbuilder.Append("HOST: 239.255.255.250:1900\r\n");
            mbuilder.Append("ST:upnp:rootdevice\r\n");
            mbuilder.Append("MAN:\"ssdp:discover\"\r\n");
            mbuilder.Append("MX:3\r\n\r\n");
            UdpClient mclient = new UdpClient();
            byte[] dgram = Encoding.ASCII.GetBytes(mbuilder.ToString());
            mclient.Send(dgram,dgram.Length,new IPEndPoint(IPAddress.Broadcast,1900));
            IPEndPoint mpoint = new IPEndPoint(IPAddress.Any, 0);
            rootsearch:

            dgram = mclient.Receive(ref mpoint);
            string mret = Encoding.ASCII.GetString(dgram);
            string orig = mret;
            mret = mret.ToLower();
            string url = orig.Substring(mret.IndexOf("location:") + "location:".Length, mret.IndexOf("\r", mret.IndexOf("location:")) - (mret.IndexOf("location:") + "location:".Length));
            WebClient wclient = new WebClient();
            try
            {
                Console.WriteLine("POLL:" + url);
                string reply = wclient.DownloadString(url);

                if (!reply.ToLower().Contains("router"))
                {
                    goto rootsearch;
                }
            }
            catch (Exception)
            {
                goto rootsearch;
            }
            return url;
        }
        public static RouterElement enumRouterFunctions(string url)
        {

            XmlReader mreader = XmlReader.Create(url);
            XmlDocument md = new XmlDocument();
            md.Load(mreader);
            XmlNodeList rootnodes = md.GetElementsByTagName("serviceList");
            RouterElement elem = new RouterElement();
            foreach (XmlNode et in rootnodes)
            {
                RouterElement el = new RouterElement(et, null);
                elem.children.Add(el);
            }

            return elem;
        }
        public static RouterElement getRouterInformation(string url)
        {
            XmlReader mreader = XmlReader.Create(url);
            XmlDocument md = new XmlDocument();
            md.Load(mreader);
            XmlNodeList rootnodes = md.GetElementsByTagName("device");
            return new RouterElement(rootnodes[0], null);
        }

    }
    public class RouterMethod
    {
        string url;
        public string MethodName;
        string parentname;
        string MakeRequest(string URL, byte[] data, string[] headers)
        {
            Uri mri = new Uri(URL);
            TcpClient mclient = new TcpClient();
            mclient.Connect(mri.Host, mri.Port);
            Stream mstream = mclient.GetStream();
            StreamWriter textwriter = new StreamWriter(mstream);
            textwriter.Write("POST "+mri.PathAndQuery+" HTTP/1.1\r\n");

            textwriter.Write("Connection: Close\r\n");

            textwriter.Write("Content-Type: text/xml; charset=\"utf-8\"\r\n");

            foreach (string et in headers)
            {
                textwriter.Write(et + "\r\n");
            }
            textwriter.Write("Content-Length: " + (data.Length).ToString()+"\r\n");
            textwriter.Write("Host: " + mri.Host+":"+mri.Port+"\r\n");


            textwriter.Write("\r\n");
            textwriter.Flush();



            Stream reqstream = mstream;
            reqstream.Write(data, 0, data.Length);
            reqstream.Flush();
            StreamReader reader = new StreamReader(mstream);
            while (reader.ReadLine().Length > 2)
            {

            }
            return reader.ReadToEnd();
        }
        public RouterElement Invoke(string[] args)
        {

            MemoryStream mstream = new MemoryStream();
            StreamWriter mwriter = new StreamWriter(mstream);
            //TODO: Implement argument list
            string arglist = "";

            mwriter.Write("" + "" + "");


            mwriter.Write("");//" + arglist + "");
            mwriter.Write("");
            mwriter.Flush();

            List headers = new List();

            headers.Add("SOAPAction: \"" + parentschema + "#" + MethodName + "\"");

            mstream.Position = 0;
            byte[] dgram = new byte[mstream.Length];

            mstream.Read(dgram, 0, dgram.Length);

            XmlDocument mdoc = new XmlDocument();
            string txt = MakeRequest(url, dgram, headers.ToArray());
            mdoc.LoadXml(txt);
            try
            {
                RouterElement elem = new RouterElement(mdoc.ChildNodes[0], null);

                return elem["Body"].children[0];
            }
            catch (Exception er)
            {
                RouterElement elem = new RouterElement(mdoc.ChildNodes[1], null);
                return elem["Body"].children[0];
            }

        }
        public List parameters = new List();
        string baseurl;
        string parentschema;
        public RouterMethod(string svcurl, RouterElement element,string pname, string baseURL, string svcpdsc)
        {
            parentschema = svcpdsc;
            baseurl = baseURL;
            parentname = pname;
            url = svcurl;
            MethodName = element["name"].Value;
            try
            {
                foreach (RouterElement et in element["argumentList"].children)
                {
                    parameters.Add(et.children[0].Value);
                }
            }
            catch (KeyNotFoundException)
            {
            }
        }
    }
    public class RouterService
    {
        string url;
        public string ServiceName;
        public List methods = new List();
        public RouterMethod GetMethodByNonCaseSensitiveName(string name)
        {
            foreach (RouterMethod et in methods)
            {
                if (et.MethodName.ToLower() == name.ToLower())
                {
                    return et;
                }
            }
            throw new KeyNotFoundException();
        }
        public RouterService(RouterElement element, string baseurl)
        {

            ServiceName = element["serviceId"].Value;
            url = element["controlURL"].Value;

            WebClient mclient = new WebClient();
            string turtle = element["SCPDURL"].Value;
            if (!turtle.ToLower().Contains("http"))
            {
                turtle = baseurl + turtle;
            }
            Console.WriteLine("service URL " + turtle);
            string axml = mclient.DownloadString(turtle);
            XmlDocument mdoc = new XmlDocument();
            if (!url.ToLower().Contains("http"))
            {
                url = baseurl + url;
            }
            mdoc.LoadXml(axml);
            XmlNode mainnode = mdoc.GetElementsByTagName("actionList")[0];
            RouterElement actions = new RouterElement(mainnode, null);
            foreach (RouterElement et in actions.children)
            {
                RouterMethod method = new RouterMethod(url, et,ServiceName,baseurl,element["serviceType"].Value);
                methods.Add(method);
            }

        }
    }
}


Code for a bandwidth meter:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using UPNPLib;
using System.IO;

namespace bandwidthmeter
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            BinaryReader mreader = new BinaryReader(File.Open("bandwidthlog.txt", FileMode.OpenOrCreate));
            if (mreader.BaseStream.Length > 0)
            {
                prevsent = mreader.ReadInt64();
                prevrecv = mreader.ReadInt64();
            }
            mreader.Close();
            List services = new List();
            string fullurl = UPNP.GetRootUrl();
            RouterElement router = UPNP.enumRouterFunctions(fullurl);
            Console.WriteLine("Router feature enumeration complete");
            foreach (RouterElement et in router.children)
            {

                services.Add(new RouterService(et.children[0], fullurl.Substring(0, fullurl.IndexOf("/", "http://".Length+1))));
            }
            getReceiveDelegate = services[1].GetMethodByNonCaseSensitiveName("GetTotalBytesReceived");
            getSentDelegate = services[1].GetMethodByNonCaseSensitiveName("GetTotalBytesSent");
            Console.WriteLine("Invoking " + getReceiveDelegate.MethodName);
            //Console.WriteLine(services[1].GetMethodByNonCaseSensitiveName("GetTotalPacketsSent").Invoke(null));

            Timer mymer = new Timer();
            mymer.Tick += new EventHandler(mymer_Tick);
            mymer.Interval = 1000;
            mymer.Start();
            FormClosed += new FormClosedEventHandler(Form1_FormClosed);
        }
        long prevsent = 0;
        long prevrecv = 0;
        void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            BinaryWriter mwriter = new BinaryWriter(File.Open("bandwidthlog.txt", FileMode.OpenOrCreate));
            mwriter.Write(getsent());
            mwriter.Write(getreceived());
            mwriter.Flush();
            mwriter.Close();

        }
        long getsent()
        {
            long retval = Convert.ToInt64(getSentDelegate.Invoke(null).children[0].Value);
            if (prevsent > retval)
            {
                retval = prevsent + retval;
            }
            return retval;
        }
        long getreceived()
        {
            long retval = Convert.ToInt64(getReceiveDelegate.Invoke(null).children[0].Value);
            if (prevrecv > retval)
            {
                retval = prevrecv + retval;
            }
            return retval;
        }
        void mymer_Tick(object sender, EventArgs e)
        {
            label1.Text = "Sent: "+(getsent()/1024/1024).ToString()+"MB\nReceived: "+(getreceived()/1024/1024).ToString()+"MB";

        }
        RouterMethod getSentDelegate;
        RouterMethod getReceiveDelegate;

    }
}