gpt4 book ai didi

.net - 使用 NetworkInterface.Name 时出现问题

转载 作者:行者123 更新时间:2023-12-01 15:54:26 26 4
gpt4 key购买 nike

我正在使用以下代码来检测我的电脑上网络接口(interface)卡的名称。我正在使用 USB 调制解调器。

public class DetectNIC
{
public string ReturnNIC()
{
List<NetworkInterface> Interfaces = new List<NetworkInterface>();
foreach (var nic in NetworkInterface.GetAllNetworkInterfaces())
{
if (nic.OperationalStatus == OperationalStatus.Up)
{
Interfaces.Add(nic);
}
}

NetworkInterface result = null;
foreach (NetworkInterface nic in Interfaces)
{
if (result == null)
{
result = nic;
}
else
{
if (nic.GetIPProperties().GetIPv4Properties() != null)
{
if (nic.GetIPProperties().GetIPv4Properties().Index < result.GetIPProperties().GetIPv4Properties().Index)
result = nic;
}
}
}
return result.Name.ToString();
}
}

我将结果传递给下面给定的类来计算互联网流量期间的字节消耗:

public class ByteCounter
{
public double GetNetworkUtilization(string networkCard)
{
const int numberOfIterations = 10;

PerformanceCounter bandwidthCounter =
new PerformanceCounter("Network Interface", "Current Bandwidth", networkCard);

float bandwidth = bandwidthCounter.NextValue();

PerformanceCounter dataSentCounter =
new PerformanceCounter("Network Interface", "Bytes Sent/sec", networkCard);

PerformanceCounter dataReceivedCounter =
new PerformanceCounter("Network Interface", "Bytes Received/sec", networkCard);

float sendSum = 0;
float receiveSum = 0;

for (int index = 0; index < numberOfIterations; index++)
{
sendSum += dataSentCounter.NextValue();
receiveSum += dataReceivedCounter.NextValue();
}

float dataSent = sendSum;
float dataReceived = receiveSum;

double utilization = (8 * (dataSent + dataReceived)) / (bandwidth * numberOfIterations) * 100;
return utilization;
}
}

第一个代码工作正常。它将我的调制解调器检测为“MBlaze USB 调制解调器”,但是当控制到达具有以下行的第二个代码时:

float bandwidth = bandwidthCounter.NextValue();

它显示错误:

System.InvalidOperationException was unhandled
Message="Instance 'MBlaze USB Modem' does not exist in the specified Category."
Source="System"
StackTrace:
at System.Diagnostics.CounterDefinitionSample.GetInstanceValue(String instanceName)
at System.Diagnostics.PerformanceCounter.NextSample()
at System.Diagnostics.PerformanceCounter.NextValue()
at LogTraffic.ByteCounter.GetNetworkUtilization(String networkCard) in F:\Projects\LogTraffic\bytecounter.cs:line 15
at LogTraffic.MainForm.MainForm_Load(Object sender, EventArgs e) in F:\Projects\LogTraffic\MainForm.cs:line 24
at System.Windows.Forms.Form.OnLoad(EventArgs e)
at System.Windows.Forms.Form.OnCreateControl()
at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
at System.Windows.Forms.Control.CreateControl()
at System.Windows.Forms.Control.WmShowWindow(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
at System.Windows.Forms.ContainerControl.WndProc(Message& m)
at System.Windows.Forms.Form.WmShowWindow(Message& m)
at System.Windows.Forms.Form.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.SafeNativeMethods.ShowWindow(HandleRef hWnd, Int32 nCmdShow)
at System.Windows.Forms.Control.SetVisibleCore(Boolean value)
at System.Windows.Forms.Form.SetVisibleCore(Boolean value)
at System.Windows.Forms.Control.set_Visible(Boolean value)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.Run(Form mainForm)
at LogTraffic.Program.Main() in F:\Projects\LogTraffic\Program.cs:line 18
at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException:

问题是什么?

我不会忘记感谢这两个代码的作者。

第一个代码信用:Keyvan Nayyeri

第二个代码信用:entens他的回答here .

最佳答案

我修改了 NIC 查找代码以返回 result.Description 而不是 result.Name。这应该给出用作 InstanceName 的完整接口(interface)名称。

但是,Windows 将替换特殊字符,因此您应该注意这一点。可以在 MSDN 页面上找到 PerformanceCounter.InstanceName属性。

我还对 Keyvan Nayyeri 的代码进行了一些修改,以调整输入字符串以匹配预期的实例名称。此外,我还合并了 Aliostad 的代码,用于在类别中搜索匹配的名称,但仅当 InstanceName 不存在时才会抛出异常。

    public double GetNetworkUtilization(string networkCard)
{
const int numberOfIterations = 10;

// Condition networkCard;
networkCard = networkCard.Replace("\\", "_");
networkCard = networkCard.Replace("/", "_");
networkCard = networkCard.Replace("(", "[");
networkCard = networkCard.Replace(")", "]");
networkCard = networkCard.Replace("#", "_");

PerformanceCounterCategory NetworkInterfaceCatagory =
PerformanceCounterCategory.GetCategories().Where(c => c.CategoryName.Equals("Network Interface")).FirstOrDefault();

//// DEBUG: Check this array to see if the network card exists
//foreach(string instance in NetworkInterfaceCatagory.GetInstanceNames())
//{
// System.Diagnostics.Debug.Print(instance);
//}

if (string.IsNullOrEmpty(NetworkInterfaceCatagory.GetInstanceNames().Where(i => i.Equals(networkCard)).FirstOrDefault()))
throw new ApplicationException("NIC does not exist in existing performance counters");

string instanceName = networkCard;

PerformanceCounter bandwidthCounter =
new PerformanceCounter("Network Interface", "Current Bandwidth", instanceName);

PerformanceCounter dataSentCounter =
new PerformanceCounter("Network Interface", "Bytes Sent/sec", instanceName);

PerformanceCounter dataReceivedCounter =
new PerformanceCounter("Network Interface", "Bytes Received/sec", instanceName);

float bandwidth = bandwidthCounter.NextValue();
float sendSum = 0;
float receiveSum = 0;

for (int index = 0; index < numberOfIterations; index++)
{
sendSum += dataSentCounter.NextValue();
receiveSum += dataReceivedCounter.NextValue();
}

float dataSent = sendSum;
float dataReceived = receiveSum;

double utilization = (8 * (dataSent + dataReceived)) / (bandwidth * numberOfIterations) * 100;
return utilization;
}

关于.net - 使用 NetworkInterface.Name 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4173287/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com