获取网关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;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值