我想以编程方式选择连接到Internet的网卡。我需要这个来监控通过卡的流量。 这是我用来获取实例名称
的方法var category = new PerformanceCounterCategory("Network Interface");
String[] instancenames = category.GetInstanceNames();
这就是 instancenames 在我的机器上的显示方式
[0] "6TO4 Adapter"
[1] "Internal"
[2] "isatap.{385049D5-5293-4E76-A072-9F7A15561418}"
[3] "Marvell Yukon 88E8056 PCI-E Gigabit Ethernet Controller"
[4] "isatap.{0CB9C3D2-0989-403A-B773-969229ED5074}"
[5] "Local Area Connection - Virtual Network"
[6] "Teredo Tunneling Pseudo-Interface"
我希望解决方案能够强大并适用于其他PC,我也更喜欢.NET。我找到了其他解决方案,但它们似乎更复杂
还有别的吗?
谢谢!
修改
在投票结束这个问题之前,请先阅读它,看看我已经提到了一些可用的解决方案。我问是否还有其他更简单和更强大的功能(即 NOT C ++,WMI或解析控制台应用程序输出)
答案 0 :(得分:1)
我最终使用WMI和外部函数调用,没有找到更好的解决方案。如果有人有兴趣,这是我的代码。
using System;
using System.Collections.Generic;
using System.Diagnostics.Contracts;
using System.Linq;
using System.Management;
using System.Net;
using System.Net.Sockets;
using System.Runtime.InteropServices;
using log4net;
namespace Networking
{
internal class NetworkCardLocator
{
[DllImport("iphlpapi.dll", CharSet = CharSet.Auto)]
public static extern int GetBestInterface(UInt32 DestAddr, out UInt32 BestIfIndex);
private static ILog log = OperationLogger.Instance();
/// <summary>
/// Selectes the name of the connection that is used to access internet or LAN
/// </summary>
/// <returns></returns>
internal static string GetConnectedCardName()
{
uint idx = GetConnectedCardIndex();
string query = String.Format("SELECT * FROM Win32_NetworkAdapter WHERE InterfaceIndex={0}", idx);
var searcher = new ManagementObjectSearcher
{
Query = new ObjectQuery(query)
};
try
{
ManagementObjectCollection adapterObjects = searcher.Get();
var names = (from ManagementObject o in adapterObjects
select o["Name"])
.Cast<string>()
.FirstOrDefault();
return names;
}
catch (Exception ex)
{
log.Fatal(ex);
throw;
}
}
private static uint GetConnectedCardIndex()
{
try
{
string localhostName = Dns.GetHostName();
IPHostEntry ipEntry = Dns.GetHostEntry(localhostName);
IPAddress[] addresses = ipEntry.AddressList;
var address = GetNeededIPAddress(addresses);
uint ipaddr = IPAddressToUInt32(address);
uint interfaceindex;
GetBestInterface(ipaddr, out interfaceindex);
return interfaceindex;
}
catch (Exception ex)
{
log.Fatal(ex);
throw;
}
}
private static uint IPAddressToUInt32(IPAddress address)
{
Contract.Requires<ArgumentNullException>(address != null);
try
{
byte[] byteArray1 = IPAddress.Parse(address.ToString()).GetAddressBytes();
byte[] byteArray2 = IPAddress.Parse(address.ToString()).GetAddressBytes();
byteArray1[0] = byteArray2[3];
byteArray1[1] = byteArray2[2];
byteArray1[2] = byteArray2[1];
byteArray1[3] = byteArray2[0];
return BitConverter.ToUInt32(byteArray1, 0);
}
catch (Exception ex)
{
log.Fatal(ex);
throw;
}
}
private static IPAddress GetNeededIPAddress(IEnumerable<IPAddress> addresses)
{
var query = from address in addresses
where address.AddressFamily == AddressFamily.InterNetwork
select address;
return query.FirstOrDefault();
}
}
}