368d6fafea
Code backup
142 lines
3.2 KiB
C#
142 lines
3.2 KiB
C#
using System;
|
|
using System.Net;
|
|
using System.Linq;
|
|
using System.Collections;
|
|
using System.Runtime.InteropServices;
|
|
|
|
namespace devlist
|
|
{
|
|
public class IPEnumeration: IEnumerable
|
|
{
|
|
private string startAddress;
|
|
private string endAddress;
|
|
|
|
internal static Int64 AddressToInt(IPAddress addr)
|
|
{
|
|
byte[] addressBits = addr.GetAddressBytes();
|
|
|
|
Int64 retval = 0;
|
|
for (int i = 0; i < addressBits.Length; i++)
|
|
{
|
|
retval = (retval << 8) + (int)addressBits[i];
|
|
}
|
|
|
|
return retval;
|
|
}
|
|
|
|
internal static Int64 AddressToInt(string addr)
|
|
{
|
|
return AddressToInt(IPAddress.Parse(addr));
|
|
}
|
|
|
|
internal static IPAddress IntToAddress(Int64 addr)
|
|
{
|
|
return IPAddress.Parse(addr.ToString());
|
|
}
|
|
|
|
|
|
public IPEnumeration(string startAddress, string endAddress)
|
|
{
|
|
this.startAddress = startAddress;
|
|
this.endAddress = endAddress;
|
|
}
|
|
|
|
IEnumerator IEnumerable.GetEnumerator()
|
|
{
|
|
return (IEnumerator) GetEnumerator();
|
|
}
|
|
|
|
public IPEnumerator GetEnumerator()
|
|
{
|
|
return new IPEnumerator(startAddress, endAddress);
|
|
}
|
|
|
|
}
|
|
|
|
public class IPEnumerator: IEnumerator
|
|
{
|
|
private string startAddress;
|
|
private string endAddress;
|
|
private Int64 currentIP;
|
|
private Int64 endIP;
|
|
|
|
public IPEnumerator(string startAddress, string endAddress)
|
|
{
|
|
this.startAddress = startAddress;
|
|
this.endAddress = endAddress;
|
|
|
|
currentIP = IPEnumeration.AddressToInt(startAddress);
|
|
endIP = IPEnumeration.AddressToInt(endAddress);
|
|
}
|
|
|
|
public bool MoveNext()
|
|
{
|
|
currentIP++;
|
|
return (currentIP <= endIP);
|
|
}
|
|
|
|
public void Reset()
|
|
{
|
|
currentIP = IPEnumeration.AddressToInt(startAddress);
|
|
}
|
|
|
|
object IEnumerator.Current
|
|
{
|
|
get
|
|
{
|
|
return Current;
|
|
}
|
|
}
|
|
|
|
public IPAddress Current
|
|
{
|
|
get
|
|
{
|
|
try
|
|
{
|
|
return IPEnumeration.IntToAddress(currentIP);
|
|
}
|
|
catch (IndexOutOfRangeException)
|
|
{
|
|
throw new InvalidOperationException();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public static class IPHelper
|
|
{
|
|
[DllImport("iphlpapi.dll", ExactSpelling=true)]
|
|
public static extern int SendARP( int DestIP, int SrcIP, byte[] pMacAddr, ref uint PhyAddrLen);
|
|
|
|
public static string getMAC(IPAddress address)
|
|
{
|
|
int intAddress = BitConverter.ToInt32(address.GetAddressBytes(), 0);
|
|
|
|
byte[] macAddr = new byte[6];
|
|
uint macAddrLen = (uint) macAddr.Length;
|
|
if (SendARP(intAddress, 0, macAddr, ref macAddrLen) != 0)
|
|
return "(NO ARP result)";
|
|
|
|
string[] str = new string[(int)macAddrLen];
|
|
for (int i = 0; i < macAddrLen; i++)
|
|
str[i] = macAddr[i].ToString("x2");
|
|
|
|
return string.Join(":", str);
|
|
}
|
|
}
|
|
|
|
class Program
|
|
{
|
|
public static void Main(string[] args)
|
|
{
|
|
|
|
foreach(IPAddress addr in new IPEnumeration("172.25.216.10","172.25.216.20"))
|
|
{
|
|
Console.WriteLine("{0}\t\t{1}",addr.ToString(), IPHelper.getMAC(addr));
|
|
}
|
|
|
|
Console.ReadKey(true);
|
|
}
|
|
}
|
|
} |