发布时间:2024-11-22 04:48:32
在开始获取局域网内的所有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地址。
一旦我们获得了当前设备的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地址响应,则认为其处于活动状态。
现在,我们可以结合以上两个步骤,获取整个局域网内的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地址有所帮助!