gpt4 book ai didi

go - 如何从 IP 获取系统接口(interface)名称

转载 作者:行者123 更新时间:2023-12-01 21:09:34 25 4
gpt4 key购买 nike

在这里,我试图从给定的本地 IP 地址获取接口(interface)名称:

func retrieveInterfaceFromIP(myIP net.IP) (string, error) {
ifaces, err := net.Interfaces()
if err != nil {
return "", err
}
for _, iface := range ifaces {
addrs, err := iface.Addrs()
if err != nil {
return "", err
}
for _, addr := range addrs {
fmt.Println(addr.String())
ip, _, err := net.ParseCIDR(addr.String())
if err != nil {
return "", err
}
if myIP.String() == ip.String() {
return iface.Name, nil
}
}
}
return "", fmt.Errorf("Not able to identify interface for %s", myIP)
}
是否有任何直接的函数调用来从给定的 IP 获取接口(interface)名称?

最佳答案

我不知道。
但我认为您的代码应该稍作修改。因此,如果出现任何错误,您将返回,而没有考虑到如果您已经检查了正确的界面,您可能会从中获得正确的结果。好吧,当检查多个接口(interface)时,错误可能是由于任何原因造成的,您应该忽略它们并让循环继续检查所有其他接口(interface)。
同样在基准测试期间,我在下面编写的函数是 表现更好:

goos: darwin
goarch: amd64
BenchmarkRetrieveInterfaceFromIP-8 15768 75635 ns/op 16336 B/op 254 allocs/op
BenchmarkGetInterfaceByIP-8 16748 71968 ns/op 16192 B/op 244 allocs/op

Note: BenchmarkGetInterfaceByIP is the benchmarking for my function and BenchmarkRetrieveInterfaceFromIP is the benchmarking of your function.

func getInterfaceByIP(ip net.IP) (string, error) {
interfaces, err := net.Interfaces()
if err != nil {
return "", err
}
for _, iface := range interfaces {
if addrs, err := iface.Addrs(); err == nil {
for _, addr := range addrs {
if iip, _, err := net.ParseCIDR(addr.String()); err == nil {
if iip.Equal(ip) {
return iface.Name, nil
}
} else {
continue
}
}
} else {
continue
}
}
return "", errors.New("couldn't find a interface for the ip")
}
是的,我认为使用 C/C++ 的人正在做类似的事情,因为从我看到的与类似问题相关的答案之一(对于 C ),他们利用了 getifaddrs(3)这与我们所做的类似。 [Reference]

关于go - 如何从 IP 获取系统接口(interface)名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63200063/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com