如何监控网络接口(Go语言)

3
我需要监控网络接口的本地地址(IP),例如当其更改或接口被拔出时执行某些操作,我想知道最佳方法是什么。目前我正在使用InterfaceByName在无限循环中获取和验证/匹配接口详细信息。我要监视多个接口,所以我想知道这是否有问题,或者是否应该使用一些延迟等。如果操作系统能够在接口更新时发送信号那就太好了,但是我不知道有这样的东西。

你在使用什么平台? - JimB
Linux(任何版本),虽然在Mac上(仅限开发)工作也是不错的选择。 - The user with no hat
2个回答

0
这将非常依赖于系统。在Linux上,我认为目前最简单的方法是读取每个接口的 sysfs 文件。
$ cat /sys/class/net/eth0/operstate
up
$ cat /sys/class/net/eth0/carrier
1

偶尔轮询它们不应该消耗太多资源,并为您提供所需内容。
要获取更及时的更新,您可以设置一个 netlink 套接字来从内核接收 NETLINK_ROUTE 更新。有一些 Go netlink packages 可用,但我不确定它们有多通用。

0
在Golang中,您可以通过利用net和syscall包以及底层操作系统提供的特定于平台的功能来实现网络接口监控。以下是一个示例实现:
package main

import (
    "fmt"
    "net"
    "os"
    "syscall"
    "time"
)

func main() {
    interfaceName := "eth0" // Replace with your interface name

    // Retrieve the initial IP address of the interface
    initialIP, err := getCurrentIPAddress(interfaceName)
    if err != nil {
        fmt.Println("Failed to retrieve initial IP address:", err)
        os.Exit(1)
    }

    fmt.Println("Initial IP address:", initialIP)

    // Start monitoring the interface
    for {
        time.Sleep(time.Second) // Delay between each iteration

        // Retrieve the current IP address of the interface
        currentIP, err := getCurrentIPAddress(interfaceName)
        if err != nil {
            fmt.Println("Failed to retrieve current IP address:", err)
            continue
        }

        // Compare current IP with initial IP
        if currentIP != initialIP {
            fmt.Println("IP address changed:", currentIP)
            // Perform actions here for IP address change

            // Update the initial IP address for subsequent comparisons
            initialIP = currentIP
        }
    }
}

func getCurrentIPAddress(interfaceName string) (string, error) {
    iface, err := net.InterfaceByName(interfaceName)
    if err != nil {
        return "", err
    }

    addrs, err := iface.Addrs()
    if err != nil {
        return "", err
    }

    for _, addr := range addrs {
        ipNet, ok := addr.(*net.IPNet)
        if ok && !ipNet.IP.IsLoopback() && ipNet.IP.To4() != nil {
            return ipNet.IP.String(), nil
        }
    }

    return "", fmt.Errorf("No IPv4 address found for interface")
}

这个例子演示了在Golang中实现基本网络接口监控的方法。它获取指定接口的初始IP地址,然后进入一个无限循环,定期检查IP地址是否发生变化。当检测到变化时,你可以在代码的相应部分执行必要的操作。
请注意,这个实现使用net.InterfaceByName函数来获取接口的详细信息,并使用iface.Addrs函数获取与接口关联的IP地址。该示例假设使用IPv4地址;但是,如果需要,你可以修改代码以支持IPv6地址。
记得将"eth0"替换为你想要监控的接口的名称。你还可以使用time.Sleep函数自定义每次迭代之间的延迟,根据你的需求调整轮询间隔。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接