Как получить имя системного интерфейса по IP - PullRequest
1 голос
/ 01 августа 2020

Здесь я пытаюсь получить имя интерфейса с данного локального IP-адреса:

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-адреса?

1 Ответ

1 голос
/ 01 августа 2020

Мне ничего не известно.

Но я думаю, что ваш код следует немного изменить. Итак, вы возвращаетесь в случае какой-либо ошибки, не принимая во внимание, что, если вы уже проверили правильный интерфейс, вы можете получить правильный результат. Что ж, при проверке нескольких интерфейсов ошибка может быть вызвана любой причиной, и вы должны ввести их и позволить l oop продолжить проверку и всех других интерфейсов.

Также во время тестирования функции, которую я написал ниже: немного более высокая производительность:

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

Примечание: BenchmarkGetInterfaceByIP - это тест для моей функции, а BenchmarkRetrieveInterfaceFromIP - это тест для вашей функции.

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) , что аналогично тому, что мы сделали. [Ссылка]

...