g-var.com | G-VAR's Blog

Golang获取网卡信息

Wed Dec 23, 2015

转载请注明出处!

原文链接:Golang获取网卡信息


最近项目需要,想用Go语言获取网卡信息,并能用Go语言对网卡进行配置。

Go的net包可以获取网卡的IP,但不能获取网卡的子网掩码以及网关等信息,需要借助syscall包来获取子网掩码等信息,实现代码如下:

// getAdapterList()是interface_windows.go下的源码,getAdapterList()这个函数只在go 1.5之前有,1.5之后就没有该函数了,不过这不影响程序的运行。
func getAdapterList() (*syscall.IpAdapterInfo, error) {
    b := make([]byte, 1000)
    l := uint32(len(b))
    a := (*syscall.IpAdapterInfo)(unsafe.Pointer(&b[0]))
    err := syscall.GetAdaptersInfo(a, &l)
    if err == syscall.ERROR_BUFFER_OVERFLOW {
        b = make([]byte, l)
        a = (*syscall.IpAdapterInfo)(unsafe.Pointer(&b[0]))
        err = syscall.GetAdaptersInfo(a, &l)
    }
    if err != nil {
        return nil, os.NewSyscallError("GetAdaptersInfo", err)
    }
    return a, nil
}

func localAddresses() error {
    ifaces, err := net.Interfaces()
    if err != nil {
        return err
    }

    aList, err := getAdapterList()
    if err != nil {
        return err
    }

    for _, ifi := range ifaces {
        for ai := aList; ai != nil; ai = ai.Next {
            index := ai.Index

            if ifi.Index == int(index) {
                ipl := &ai.IpAddressList
                gwl := &ai.GatewayList
                for ; ipl != nil; ipl = ipl.Next  {
                    fmt.Printf("%s: %s (%s) %s\n", ifi.Name, ipl.IpAddress, ipl.IpMask, gwl.IpAddress)
                }
            }
        }
    }

    return err
}

通过以上代码可以获得网卡的名称、ip地址以及子网掩码等信息,运行结果如下(只在Windows下进行了测试):

本地连接: {192.168.1.100   } ({255.255.255.0   }) {192.168.1.1     }

接下来需要研究如何修改网卡的相关信息。

[ 转载必须在正文中标注并保留原文链接等信息。]



  « Previous: Next: »