我有类似的问题,当我想知道我的网络接口是否已知时。
我正在使用这段代码来检查不同的网络接口:
文件NetworkMonitor.cs
using System.Collections;
using System.Diagnostics;
using System.Timers;
namespace NetWork.Plus
{
public class NetworkMonitor
{
private Timer timer;
private ArrayList adapters;
private ArrayList monitoredAdapters;
public NetworkMonitor()
{
this.adapters = new ArrayList();
this.monitoredAdapters = new ArrayList();
EnumerateNetworkAdapters();
timer = new Timer(1000);
timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
}
private void EnumerateNetworkAdapters()
{
PerformanceCounterCategory category = new PerformanceCounterCategory("Network Interface");
foreach (string name in category.GetInstanceNames())
{
if (name == "MS TCP Loopback interface")
continue;
NetworkAdapter adapter = new NetworkAdapter(name);
adapter.dlCounter = new PerformanceCounter("Network Interface", "Bytes Received/sec", name);
adapter.ulCounter = new PerformanceCounter("Network Interface", "Bytes Sent/sec", name);
this.adapters.Add(adapter);
}
}
private void timer_Elapsed(object sender, ElapsedEventArgs e)
{
foreach (NetworkAdapter adapter in this.monitoredAdapters)
adapter.refresh();
}
public NetworkAdapter[] Adapters
{
get
{
return (NetworkAdapter[])this.adapters.ToArray(typeof(NetworkAdapter));
}
}
public void StartMonitoring()
{
if (this.adapters.Count > 0)
{
foreach(NetworkAdapter adapter in this.adapters)
if (!this.monitoredAdapters.Contains(adapter))
{
this.monitoredAdapters.Add(adapter);
adapter.init();
}
timer.Enabled = true;
}
}
public void StartMonitoring(NetworkAdapter adapter)
{
if (!this.monitoredAdapters.Contains(adapter))
{
this.monitoredAdapters.Add(adapter);
adapter.init();
}
timer.Enabled = true;
}
public void StopMonitoring()
{
this.monitoredAdapters.Clear();
timer.Enabled = false;
}
public void StopMonitoring(NetworkAdapter adapter)
{
if (this.monitoredAdapters.Contains(adapter))
this.monitoredAdapters.Remove(adapter);
if(this.monitoredAdapters.Count == 0)
timer.Enabled = false;
}
}
}
file NetworkAdapter.cs
using System.Diagnostics;
namespace NetWork.Plus
{
public class NetworkAdapter
{
internal NetworkAdapter(string name)
{
this.name = name;
}
private long dlSpeed, ulSpeed;
private long dlValue, ulValue;
private long dlValueOld, ulValueOld;
internal string name;
internal PerformanceCounter dlCounter, ulCounter;
internal void init()
{
this.dlValueOld = this.dlCounter.NextSample().RawValue;
this.ulValueOld = this.ulCounter.NextSample().RawValue;
}
internal void refresh()
{
this.dlValue = this.dlCounter.NextSample().RawValue;
this.ulValue = this.ulCounter.NextSample().RawValue;
this.dlSpeed = this.dlValue - this.dlValueOld;
this.ulSpeed = this.ulValue - this.ulValueOld;
this.dlValueOld = this.dlValue;
this.ulValueOld = this.ulValue;
}
public override string ToString()
{
return this.name;
}
public string Name
{
get
{
return this.name;
}
}
public long DownloadSpeed
{
get
{
return this.dlSpeed;
}
}
public long UploadSpeed
{
get
{
return this.ulSpeed;
}
}
public double DownloadSpeedKbps
{
get
{
return this.dlSpeed/1024.0;
}
}
public double UploadSpeedKbps
{
get
{
return this.ulSpeed/1024.0;
}
}
}
}
例如,您可以像这样使用这些文件:
private NetworkAdapter[] adapters;
private NetworkMonitor monitor;
你可以捕获网络设备列表,以便检查你想要的网络设备是已知还是未知的。
monitor = new NetworkMonitor()
this.adapters = monitor.Adapters
如果你想的话,你可以测量下载和/或上传速度。
根据框架的版本,你需要在exe.config文件中包含以下代码:(为了避免错误 -> InvalidOperation: 实例“XXX”不存在于指定的类别中)
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.net>
<settings>
<performanceCounters enabled="true" />
</settings>
</system.net>
</configuration>