Go语言获取本地IP地址(windows)

网上搜了很多go语言查找本地可用ip4,基本就是这一套

func main(){

    addrs, err := net.InterfaceAddrs()

   if err != nil{

          fmt.Println(err) return

   }

  for _, value := range addrs{

         if ipnet, ok := value.(*net.IPNet); ok && !ipnet.IP.IsLoopback(){

                  if ipnet.IP.To4() != nil{

                        fmt.Println(ipnet.IP.String())

                  }

         }

   }

}

我发现这样既不准确而且逻辑性很差,我之前写过QT获取本地IP的方式,发现只有一种最靠谱,通过cmd的ipconfig方式,本地有用的ip是会有默认网关,只要拿得到默认网关,那么该ip就是当前机器正在使用的ip,代码如下:

func LocalIp()  string{
   var finalIp string
   cmd := exec.Command("cmd","/c","ipconfig")
   if out, err := cmd.StdoutPipe(); err != nil {
      fmt.Println(err)
   }else{
      defer out.Close()
      if err := cmd.Start(); err != nil {
         fmt.Println(err)
      }

      if opBytes, err := ioutil.ReadAll(out); err != nil {
         log.Fatal(err)
      } else {
         str:= string(opBytes)

         var strs = strings.Split(str,"\r\n")

         if 0 != len(strs){
            var havingFinalIp4 bool = false
            var cnt int = 0
            for index,value := range strs{
               vidx := strings.Index(value,"IPv4")
               //说明已经找到该ip
               if vidx != -1{
                  ip4lines := strings.Split(value,":")
                  if len(ip4lines) == 2{
                     cnt = index
                     havingFinalIp4 = true
                     ip4str := ip4lines[1]
                     finalIp = strings.TrimSpace(ip4str)
                  }

               }
               if havingFinalIp4 && index == cnt +2{
                  lindex := strings.Index(value,":")
                  if -1 != lindex{
                     lines := strings.Split(value,":")
                     if len(lines) == 2{
                        fip := lines[1]
                        if strings.TrimSpace(fip) != ""{
                           break
                        }
                     }
                  }
                  havingFinalIp4 = false
                  finalIp = ""
               }
            }
         }
      }
   }
   return finalIp
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值