namespace GetGatMac
{
public class GetMac
{
string SetIp;
public string GetMacString(string Gat = null)
{
string MacOut;
string Ip = Gat == null ? GetNetIp() : GetGatIp();
string postfix = string.Format("-a {0}",Ip);//命令后后缀
Process p = Process.Start(new ProcessStartInfo(“arp”, postfix)
{
CreateNoWindow = true, //显示窗口
UseShellExecute = false, //关闭Shell的使用
RedirectStandardOutput = true, //重定向标准输出
});
MacOut = string.Empty;
string[] getstring = p.StandardOutput.ReadToEnd().Split(’ ‘);
foreach ( string one in getstring)
{
if (one.Trim().Length > 5 && one.IndexOf(’-’) > 0)
{
MacOut = one.Trim();
}
}
return MacOut;
}
public string GetNetIp()//获取本机Ip
{
//本机IP地址
string strLocalIP = “”;
//得到计算机名
string strPcName = Dns.GetHostName();
//得到本机IP地址数组
IPHostEntry ipEntry = Dns.GetHostEntry(strPcName);
//遍历数组
foreach (var IPadd in ipEntry.AddressList)
{
//判断当前字符串是否为正确IP地址
if (IsRightIP(IPadd.ToString()))
{
//得到本地IP地址
strLocalIP = IPadd.ToString();
break;
}
}
return strLocalIP;
}
public string GetGatIp()//获取网关Ip
{
string strGateway = “”;
//获取所有网卡
NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();
//遍历数组
foreach (var netWork in nics)
{
//单个网卡的IP对象
IPInterfaceProperties ip = netWork.GetIPProperties();
//获取该IP对象的网关
GatewayIPAddressInformationCollection gateways = ip.GatewayAddresses;
foreach (var gateWay in gateways)
{
//如果能够Ping通网关
if (IsPingIP(gateWay.Address.ToString()))
{
//得到网关地址
strGateway = gateWay.Address.ToString();
//跳出循环
break;
}
}
//如果已经得到网关地址
if (strGateway.Length > 0)
{
break;
}
}
return strGateway;
}
/// <summary>
/// 判断是否为正确的IP地址
/// </summary>
/// <param name="strIPadd">需要判断的字符串</param>
/// <returns>true = 是 false = 否</returns>
public static bool IsRightIP(string strIPadd)
{
//利用正则表达式判断字符串是否符合IPv4格式
if (Regex.IsMatch(strIPadd, "[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}"))
{
//根据小数点分拆字符串
string[] ips = strIPadd.Split('.');
if (ips.Length == 4 || ips.Length == 6)
{
//如果符合IPv4规则
if (System.Int32.Parse(ips[0]) < 256 && System.Int32.Parse(ips[1]) < 256 & System.Int32.Parse(ips[2]) < 256 & System.Int32.Parse(ips[3]) < 256)
//正确
return true;
//如果不符合
else
//错误
return false;
}
else
//错误
return false;
}
else
//错误
return false;
}
/// <summary>
/// 尝试Ping指定IP是否能够Ping通
/// </summary>
/// <param name="strIP">指定IP</param>
/// <returns>true 是 false 否</returns>
public static bool IsPingIP(string strIP)
{
try
{
//创建Ping对象
Ping ping = new Ping();
//接受Ping返回值
PingReply reply = ping.Send(strIP, 1000);
//Ping通
return true;
}
catch
{
//Ping失败
return false;
}
}
}
}
//使用方式
// GetMac get = new GetMac();
// this.textBox1.Text = get.GetMacString("22");
另一个方法
[DllImport(“ws2_32.dll”)]
private static extern int inet_addr(string cp);
[DllImport("IPHLPAPI.dll")]
private static extern int SendARP(Int32 DestIP, Int32 ScrIP, ref Int64 pMacAddr, ref Int32 PhyAddrLen);
//ref和out在C#中既可以通过值引用传递参数。通过引用参数传递参数允许函数成员更改参数的值
//并保持该更改。若要通过引用传递参数,可以使用ref或者out关键字。ref和out这两个关键字都
//能够提供相似的功效,其作用很像C中的指针变量
//使用ref型参数时,传入的参数必须先被初始化。对out而言,必须在方法中对其完成初始化。
//使用ref和out时,在方法的参数和执行方法时,都要加Ref或Out关键字。以满足匹配。
//out适合用在需要retrun多个返回值的地方,而ref则用在需要被调用的方法修改调用者的引用的时候。
public static string GetMacAddress(string hostip)//获取远程IP(不能跨网段)的MAC地址
{
string Mac = "";
try
{
Int32 ldest = inet_addr(hostip); //将IP地址从 点数格式转换成无符号长整型
Int64 macinfo = new Int64();
Int32 len = 6;
//SendARP函数发送一个地址解析协议(ARP)请求获得指定的目的地IPv4地址相对应的物理地址
SendARP(ldest, 0, ref macinfo, ref len);
string TmpMac = Convert.ToString(macinfo, 16).PadLeft(12, '0');//转换成16进制 注意有些没有十二位
Mac = TmpMac.Substring(0, 2).ToUpper();//
for (int i = 2; i < TmpMac.Length; i = i + 2)
{
Mac = TmpMac.Substring(i, 2).ToUpper() + "-" + Mac;
}
}
catch (Exception Mye)
{
Mac = "获取远程主机的MAC错误:" + Mye.Message;
}
return Mac;
}