#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); } }