golang获取网卡信息操作
作者:路人99527 发布时间:2024-02-22 01:57:17
标签:golang,网卡
我就废话不多说了,大家还是直接看代码吧~
package main
import (
"fmt"
"os/exec"
"strings"
"github.com/safchain/ethtool"
)
func main() {
baseNicPath := "/sys/class/net/"
cmd := exec.Command("ls", baseNicPath)
buf, err := cmd.Output()
if err != nil {
//fmt.Println("Error:", err)
return
}
output := string(buf)
for _, device := range strings.Split(output, "\n") {
if len(device) > 1 {
fmt.Println(device)
ethHandle, err := ethtool.NewEthtool()
if err != nil {
panic(err.Error())
}
defer ethHandle.Close()
stats, err := ethHandle.LinkState(device)
if err != nil {
panic(err.Error())
}
fmt.Printf("LinkName: %s LinkState: %d\n", device, stats)
}
}
}
©
补充:GO 语言取得 Ethernet 类型的网卡地址
在 C# 中取得 Ethernet 类型的网卡地址
在 C# 中,因为有 NetworkInterface .NetworkInterfaceType == NetworkInterfaceType.Ethernet 所以,很容易在代码中进行判断。
public static PhysicalAddress GetMacAddress()
{
foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
{
// Only consider Ethernet network interfaces
if (nic.NetworkInterfaceType == NetworkInterfaceType.Ethernet) // nic.OperationalStatus == OperationalStatus.Up
{
return nic.GetPhysicalAddress();
}
}
return null;
}
在 GO 中的处理办法
搜索百度百十回,没有找到答案,无奈,搜索 net 包的源码,找到蛛丝马迹,在未公开的方法中,找到一个类型的判断语句。net/interface_windows.go 中,有 case windows.IF_TYPE_ETHERNET_CSMACD 的类型判断。
再查找 IF_TYPE_ETHERNET_CSMACD 的资料,正是这里所需要的。
参考:IP_INTERFACE_NAME_INFO_W2KSP1 structure
于是,将需要的部分复制出来加以改造,得到 IsEthernet 方法,结合 net 包中已有的方法,参数使用 net.Interface 的 Index 来使用。
完整代码如下:
package machine
import (
"errors"
"net"
"os"
"strings"
"syscall"
"unsafe"
"golang.org/x/sys/windows"
)
func GetMACAddress() (string, error) {
netInterfaces, err := net.Interfaces()
if err != nil {
panic(err.Error())
}
mac, macerr := "", errors.New("no valid mac address")
for i := 0; i < len(netInterfaces); i++ {
if (netInterfaces[i].Flags&net.FlagLoopback) == 0 && strings.Contains(netInterfaces[i].Flags.String(), "broadcast") {
index := netInterfaces[i].Index
if isEthernet(index) {
mac = netInterfaces[i].HardwareAddr.String()
return mac, nil
}
}
}
return mac, macerr
}
// 根据网卡接口 Index 判断其是否为 Ethernet 网卡
func isEthernet(ifindex int) bool {
aas, err := adapterAddresses()
if err != nil {
return false
}
result := false
for _, aa := range aas {
index := aa.IfIndex
if ifindex == int(index) {
switch aa.IfType {
case windows.IF_TYPE_ETHERNET_CSMACD:
result = true
}
if result {
break
}
}
}
return result
}
// 从 net/interface_windows.go 中复制过来
func adapterAddresses() ([]*windows.IpAdapterAddresses, error) {
var b []byte
l := uint32(15000) // recommended initial size
for {
b = make([]byte, l)
err := windows.GetAdaptersAddresses(syscall.AF_UNSPEC, windows.GAA_FLAG_INCLUDE_PREFIX, 0, (*windows.IpAdapterAddresses)(unsafe.Pointer(&b[0])), &l)
if err == nil {
if l == 0 {
return nil, nil
}
break
}
if err.(syscall.Errno) != syscall.ERROR_BUFFER_OVERFLOW {
return nil, os.NewSyscallError("getadaptersaddresses", err)
}
if l <= uint32(len(b)) {
return nil, os.NewSyscallError("getadaptersaddresses", err)
}
}
var aas []*windows.IpAdapterAddresses
for aa := (*windows.IpAdapterAddresses)(unsafe.Pointer(&b[0])); aa != nil; aa = aa.Next {
aas = append(aas, aa)
}
return aas, nil
}
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。
来源:https://blog.csdn.net/qq_39968176/article/details/90263125
0
投稿
猜你喜欢
- 爆库语句,修改红色部分的数字挨个猜出库 /**/and/**/(select/**/top/**/1/**/isnull(cast([nam
- 几个月来好像就现在暂时无需求,稍微轻松一下,然后在Q群中发现有人提问,怎么用CSS实现数学公式“四又二分之一”。对于这个公式个人
- 下面十条内容的标题原本是《10 Lessons for Young Designers》,是John C. Jay给年青设计师们的十条经验教
- 在本节描述的示例代码,提供真实的例子来示范在 FileSystemObject 对象模式中可用的许多功能。该代码显示了如何一起使用对象模式的
- webconfig配置:<connectionStrings> <add name="MS
- 近日,某个QQ 群里的一个朋友提出一个问题,如何将一个DB 的表结构同步给另一个DB。针对这个问题,我进行了思考与实践,具体的实现代码如下所
- 经常会有定时备份SQL Server数据库的需要。定时备份到本机的话,还是挺容易的,计划任务就可以完成,但如果是整机挂了,那备份到本机是没意
- 在做开发的朋友特别是和mysql有接触的朋友会碰到有时mysql查询很慢,当然我指的是大数据量百万千万级了,不是几十条了,下面我们来看看解决
- 近来在训练检测网络的时候会出现loss为nan的情况,需要中断重新训练,会很麻烦。因而选择使用PyTorch提供的梯度裁剪库来对模型训练过程
- Python获取多线程返回结果在 Python 的多线程中,有时候我们会需要每一个线程中返回的结果。然而,在经过我的多番尝试、以及网上各种博
- 在开发过程中,我们经常会将日期时间的毫秒数存放到数据库,但是它对应的时间看起来就十分不方便,我们可以使用一些函数将毫秒转换成date格式。
- 前言本文给大家详细介绍了解决php-fpm.service not found问题的相关内容,文中介绍的非常详细,下面来一起看看详细的介绍:
- 我使用的python版本是3.5.2今天想做个语音读取的小脚本,在网上查了一下发现python里有个pyttsx可以识别文字,打算通过pip
- Whoosh 是纯Python实现的全文搜索引擎,通过Whoosh可以很方便的给文档加上全文索引功能。什么是全文检索简单讲分为两块,一块是分
- 1.图片来源该图片来源于百度图片,如果侵权,请联系我删除!图片仅用于知识交流。2.读取图片并显示imread():读取图片;imshow()
- 最近工作需要把单片机读取的传感器电压数据实时在PC上通过曲线显示出来,刚好在看python, 就试着用了python 与uart端口通讯,并
- AutoGrad 是一个老少皆宜的 Python 梯度计算模块。对于初高中生而言,它可以用来轻易计算一条曲线在任意一个点上的斜率。对于大学生
- 什么是.netMicrosoft® .NET 是 Microsoft XML Web services 平台。XML Web
- python怎么求最大公约数和最小公倍数一、求最大公约数用辗转相除法求最大公约数的算法如下:两个正整数a和b(a>b),它们的最大公约
- 前言在php开发过程中,获取文件扩展名是非常常见的需求。比如我们在上传文件的时候,首先需要判断文件类型是否为我们允许上传的类型。这个时候就需