发布时间:2024-12-22 22:41:12
Golang中的localaddr是一个函数,用于获取一个TCP或UDP连接的本地地址。该函数返回一个net.Addr接口类型的值,代表了本地地址。
使用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函数建立连接,则需要注意可能会返回一个超时错误,此时可以根据需要进行重试。
获取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函数进行解析。
除了用于获取连接的本地地址外,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地址、主机名以及所有端口号。这些功能在网络编程和服务器开发中非常有用。