项目中需要获取网卡的一些硬件信息,但遇到一点问题,现在用另一种方式解决了;但还是想搞懂为什么会报这个错误,基础太差,希望得到大佬的指导,非常感谢。
package main
import (
"fmt"
"golang.org/x/sys/unix"
"syscall"
"unsafe"
)
func main() {
for {
go func() {
fd, err := unix.Socket(unix.AF_INET, unix.SOCK_DGRAM, unix.IPPROTO_IP)
defer func() {
if err := unix.Close(fd); err != nil {
fmt.Println("fd 关闭失败:", err)
}
}()
if err != nil {
fmt.Println(err)
return
}
var et struct {
Cmd uint32
Supported uint32
}
const GSET = 0x1
et.Cmd = GSET
var ifr struct {
Name [16]byte
Data uintptr
}
copy(ifr.Name[:], []byte("网卡名称"))
ifr.Data = uintptr(unsafe.Pointer(&et))
const SIOCETHTOOL = 0x8946
// 执行这一步后,fd 就无法关闭,close 返回 bad file descriptor
_, _, errno := syscall.Syscall(syscall.SYS_IOCTL, uintptr(fd), uintptr(SIOCETHTOOL), uintptr(unsafe.Pointer(&ifr)))
if errno != 0 {
fmt.Println(errno)
}
}()
}
select {}
}