#region
using System.Collections.Generic;
using System.Net;
using System.Net.NetworkInformation;
using System.Net.Sockets;
using System.Runtime.InteropServices;
using System.Text;
using System.Text.RegularExpressions;
#endregion
namespace CSFrameworkV5.Common
{
///
/// C#网络工具类,获取IP/MAC地址
///
public class NetTools
{
///
/// 获取本机IP
///
///
public static string GetLocalIP()
{
var ipe = Dns.GetHostEntry(Dns.GetHostName());
foreach (var IP in ipe.AddressList)
if (IP.AddressFamily == AddressFamily.InterNetwork)
return IP.ToStringEx();
return "";
}
///
/// 获取第一个MAC地址
///
///
public static string GetLocalMac()
{
var macs = GetMacByNetworkInterface();
if (macs.Count > 0) return macs[0];
return "";
}
///
/// 通过NetworkInterface读取网卡Mac
///
///
public static List GetMacByNetworkInterface()
{
var macs = new List();
var interfaces = NetworkInterface.GetAllNetworkInterfaces();
foreach (var ni in interfaces)
macs.Add(ni.GetPhysicalAddress().ToStringEx());
return macs;
}
///
/// 根据本地IP地址获取MAC地址(Windows API函数方式)
///
///
///
public static string GetMACFromIP(string IP)
{
var strRet = "Unknown";
var strIPPattern = @"^\d+\.\d+\.\d+\.\d+$";
var objRex = new Regex(strIPPattern);
if (objRex.IsMatch(IP))
{
var intDest = inet_addr(IP);
var arrMAC = new int[2];
var intLen = 6;
var intResult = SendARP(intDest, 0, ref arrMAC[0], ref intLen);
if (intResult == 0)
{
var arrbyte = new byte[8];
arrbyte[5] = (byte)(arrMAC[1] >> 8);
arrbyte[4] = (byte)arrMAC[1];
arrbyte[3] = (byte)(arrMAC[0] >> 24);
arrbyte[2] = (byte)(arrMAC[0] >> 16);
arrbyte[1] = (byte)(arrMAC[0] >> 8);
arrbyte[0] = (byte)arrMAC[0];
var strbMAC = new StringBuilder();
for (var intIndex = 0; intIndex < 6; intIndex++)
{
if (intIndex > 0) strbMAC.Append("-");
strbMAC.Append(arrbyte[intIndex].ToString("X2"));
}
strRet = strbMAC.ToString();
}
}
return strRet;
}
[DllImport("Ws2_32.dll")]
private static extern int inet_addr(string ip);
[DllImport("Iphlpapi.dll")]
private static extern int SendARP(int dest, int host, ref int mac,
ref int length);
}
}