using System; using System.Text; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Net.NetworkInformation; using System.Runtime.InteropServices; using SharpPcap.Containers; namespace SharpPcap { /// /// List of available Pcap Interfaces. /// public class PcapDeviceList : ReadOnlyCollection { /// /// Represents a strongly typed, read-only list of PcapDevices. /// public PcapDeviceList() : base(new List()) { IntPtr devicePtr = IntPtr.Zero; StringBuilder errorBuffer = new StringBuilder(256); int result = SafeNativeMethods.pcap_findalldevs(ref devicePtr, errorBuffer); if (result < 0) throw new PcapException(errorBuffer.ToString()); IntPtr nextDevPtr = devicePtr; while (nextDevPtr != IntPtr.Zero) { // Marshal pointer into a struct PcapUnmanagedStructures.pcap_if pcap_if_unmanaged = (PcapUnmanagedStructures.pcap_if)Marshal.PtrToStructure(nextDevPtr, typeof(PcapUnmanagedStructures.pcap_if)); PcapInterface pcap_if = new PcapInterface(pcap_if_unmanaged); base.Items.Add(new PcapDevice(pcap_if)); nextDevPtr = pcap_if_unmanaged.Next; } SafeNativeMethods.pcap_freealldevs(devicePtr); // Free unmanaged memory allocation. // go through the network interfaces to populate the mac address // for each of the devices NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces(); foreach(PcapDevice device in Items) { // Console.WriteLine("device.Name is {0}", device.Name); foreach(NetworkInterface adapter in nics) { // Console.WriteLine("adapter.Id of {0}", adapter.Id); // Console.WriteLine("adapter.GetPhysicalAddress() {0}", adapter.GetPhysicalAddress().ToString()); // if the name and id match then we have found the NetworkInterface // that matches the PcapDevice if(device.Name.EndsWith(adapter.Id)) { device.Interface.MacAddress = adapter.GetPhysicalAddress(); device.Interface.FriendlyName = adapter.Name; } } } } #region PcapDevice Indexers /// The name or description of the pcap interface to get. public PcapDevice this[string Name] { get { List devices = (List)base.Items; PcapDevice dev = devices.Find(delegate(PcapDevice i) { return i.Name == Name; }); PcapDevice result = dev ?? devices.Find(delegate(PcapDevice i) { return i.Description == Name; }); if (result == null) throw new IndexOutOfRangeException(); return result; } } #endregion } }