golang localaddr

发布时间:2024-12-22 22:41:12

Golang中的localaddr是一个函数,用于获取一个TCP或UDP连接的本地地址。该函数返回一个net.Addr接口类型的值,代表了本地地址。

1. 获取TCP连接的本地地址

使用Golang的net包的Dial函数连接到远程TCP服务器时,可以通过对返回的net.Conn类型值调用LocalAddr方法来获取本地地址。例如:

conn, err := net.Dial("tcp", "example.com:80")
if err != nil {
    fmt.Println(err)
    return
}
localAddr := conn.LocalAddr()
fmt.Println(localAddr)

这样就可以获取到本地TCP连接的IP地址和端口号。如果是通过net.DialTimeout函数建立连接,则需要注意可能会返回一个超时错误,此时可以根据需要进行重试。

2. 获取UDP连接的本地地址

获取UDP连接的本地地址与获取TCP连接的本地地址类似。同样是通过对net.Conn类型值调用LocalAddr方法来完成。以下是一个示例:

serverAddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:8888")
if err != nil {
    fmt.Println(err)
    return
}
conn, err := net.DialUDP("udp", nil, serverAddr)
if err != nil {
    fmt.Println(err)
    return
}
localAddr := conn.LocalAddr()
fmt.Println(localAddr)

这样就可以获取到本地UDP连接的IP地址和端口号。需要注意的是,UDP连接是无连接的,所以在使用DialUDP函数建立连接时,对端地址需要提前通过net.ResolveUDPAddr函数进行解析。

3. 更多用途

除了用于获取连接的本地地址外,localaddr函数还可以用于其他一些场景:

1)获取本地IP地址

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

通过遍历所有网络接口的地址,可以获取到本地所有的IP地址。

2)获取本地主机名

hostname, err := os.Hostname()
if err != nil {
    fmt.Println(err)
    return
}
fmt.Println(hostname)

通过调用os包的Hostname函数,可以获取到本地主机的名称。

3)获取本地所有端口号

ports := make([]int, 0)
for port := 1024; port <= 65535; port++ {
    ln, err := net.Listen("tcp", fmt.Sprintf(":%d", port))
    if err == nil {
        ln.Close()
        ports = append(ports, port)
    }
}
fmt.Println(ports)

通过尝试在本地所有端口上进行Listen操作,可以获取到当前可用的所有端口号。

通过以上几个示例,可以看出,在Golang中,localaddr函数不仅可以用于获取TCP和UDP连接的本地地址,还可以用于获取本地IP地址、主机名以及所有端口号。这些功能在网络编程和服务器开发中非常有用。

相关推荐