最近在寫一個局域網控制軟件,需要得到本機IP以及網關地址。Google搜了一些,並沒有個很好的辦法,於是自己摸索寫下了這個方法。如果覺得有些地方欠妥的話,希望能夠回帖指正。謝謝!
/// <summary> /// 得到本機IP /// </summary> private string GetLocalIP() { //本機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; } } //返回本地IP地址 return strLocalIP; }
//得到網關地址 private string GetGateway() { //網關地址 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; } }