📜  ping 和公共 IP 地址,例如 Google 的公共 DNS 服务器 - Go 编程语言(1)

📅  最后修改于: 2023-12-03 14:45:30.429000             🧑  作者: Mango

Ping 和公共 IP 地址 - Go 编程语言

在网络通信中,ping 是一种常用的工具,用于测试主机之间的连通性。它通过向目标主机发送 ICMP Echo 请求,并接收 ICMP Echo 响应来确定网络延迟和丢包情况。

除了 ping 命令外,你可以使用 Go 编程语言来编写自己的 ping 程序,以实现自定义的网络检测和诊断功能。

获取公共 IP 地址

公共 IP 地址是指能够在 Internet 上访问的 IP 地址。获取公共 IP 地址有多种方法,下面是使用 Go 编程语言的示例代码:

package main

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

func main() {
	ip, err := externalIP()
	if err != nil {
		fmt.Println("Failed to get public IP address:", err)
		os.Exit(1)
	}
	fmt.Println("Public IP address:", ip)
}

func externalIP() (string, error) {
	ifaces, err := net.Interfaces()
	if err != nil {
		return "", err
	}
	for _, iface := range ifaces {
		if iface.Flags&net.FlagUp != 0 && iface.Flags&net.FlagLoopback == 0 {
			addrs, err := iface.Addrs()
			if err != nil {
				return "", err
			}
			for _, addr := range addrs {
				ipNet, ok := addr.(*net.IPNet)
				if ok && !ipNet.IP.IsLoopback() {
					if ipNet.IP.To4() != nil {
						return ipNet.IP.String(), nil
					}
				}
			}
		}
	}
	return "", fmt.Errorf("No public IP address found")
}

上述代码中,我们使用了 net 包来获取系统上的网络接口,然后通过筛选得到非回环接口的 IPv4 地址。

Ping 示例

下面的示例代码演示了如何使用 Go 编程语言实现一个简单的 ping 函数:

package main

import (
	"fmt"
	"log"
	"net"
	"time"
)

func main() {
	host := "8.8.8.8"  // Google 的公共 DNS 服务器 IP 地址
	timeout := 1 * time.Second

	if err := ping(host, timeout); err != nil {
		log.Fatal(err)
	}

	fmt.Println("Ping successful!")
}

func ping(host string, timeout time.Duration) error {
	conn, err := net.DialTimeout("ip4:icmp", host, timeout)
	if err != nil {
		return err
	}
	defer conn.Close()

	msg := []byte{8, 0, 0, 0, 0, 1, 0, 0} // ICMP Echo 请求
	_, err = conn.Write(msg)
	if err != nil {
		return err
	}

	reply := make([]byte, 8+len(msg))
	err = conn.SetReadDeadline(time.Now().Add(timeout))
	if err != nil {
		return err
	}

	_, err = conn.Read(reply)
	if err != nil {
		return err
	}

	fmt.Println("Ping response:", reply)

	return nil
}

上述代码中,我们使用 net 包中的 DialTimeout 函数来与目标主机建立 ICMP 连接。然后,我们发送 ICMP Echo 请求,接收 ICMP Echo 响应,并打印结果。

请注意,运行 ping 功能需要具有足够的网络权限。在某些操作系统上可能需要以管理员身份运行程序。

希望以上示例代码对你理解 ping 和获取公共 IP 地址有所帮助!