天天看点

获取网关Ip C#

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