golang获取局域网内所有ip

发布时间:2024-12-23 05:07:27

使用golang编写程序可以轻松地获取局域网内的所有IP地址。在本文中,我们将介绍如何使用golang来实现这一功能。

1. 获取当前设备的IP地址

在开始获取局域网内的所有IP之前,我们首先需要获得当前设备的IP地址。使用golang的net包,我们可以轻松地实现这一功能。

下面是一个简单的示例代码:

package main

import (
	"fmt"
	"net"
)

func main() {
	interfaces, err := net.Interfaces()
	if err != nil {
		fmt.Println(err)
		return
	}

	for _, iface := range interfaces {
		addrs, err := iface.Addrs()
		if err != nil {
			fmt.Println(err)
			continue
		}
		for _, addr := range addrs {
			ip, _, err := net.ParseCIDR(addr.String())
			if err != nil {
				fmt.Println(err)
				continue
			}
			fmt.Println(ip)
		}
	}
}

运行上述代码,我们将会获得当前设备的所有IP地址。

2. 扫描局域网内的所有IP地址

一旦我们获得了当前设备的IP地址,我们就可以开始扫描局域网内的所有IP地址。为此,我们可以使用golang的net包中的函数Ping,该函数允许我们向指定的IP地址发送一个ICMP Echo请求,并等待响应。

下面是一个简单的示例代码:

package main

import (
	"fmt"
	"net"
	"os"
)

func main() {
	ip := net.IP{192, 168, 1, 1}
	for i := 1; i <= 255; i++ {
		ip[3] = byte(i)
		strIP := ip.String()
		fmt.Print("Pinging ", strIP, " ... ")

		_, err := net.Dial("ip4:icmp", strIP)
		if err != nil {
			fmt.Println("Not responding")
			continue
		}

		fmt.Println("Responding")
	}
}

在这个示例中,我们从1到255遍历了局域网地址最后一个字节,并使用Dial函数向每个地址发送一个ICMP Echo请求。如果目标IP地址响应,则认为其处于活动状态。

3. 获取整个局域网内的IP地址

现在,我们可以结合以上两个步骤,获取整个局域网内的IP地址。

下面是一个完整的示例代码:

package main

import (
	"fmt"
	"net"
	"os"
)

func main() {
	interfaces, err := net.Interfaces()
	if err != nil {
		fmt.Println(err)
		return
	}

	for _, iface := range interfaces {
		addrs, err := iface.Addrs()
		if err != nil {
			fmt.Println(err)
			continue
		}
		for _, addr := range addrs {
			ip, ok := addr.(*net.IPNet)
			if !ok {
				continue
			}
			if ip.IP.To4() == nil || ip.IP.IsLoopback() {
				continue
			}

			fmt.Println(ip.IP)
		}
	}
}

在这个示例中,我们首先获取了当前设备的所有接口,然后遍历每个接口的地址。如果该地址是IPv4地址且不是环回地址,我们就将其打印出来。

通过使用golang的net包,我们可以轻松地获取局域网内的所有IP地址。无论是获取当前设备的IP还是扫描整个局域网,都可以方便地实现。希望本文对您理解如何使用golang获取局域网内的IP地址有所帮助!

相关推荐