2
2
// Use of this source code is governed by a BSD-style
3
3
// license that can be found in the LICENSE file.
9
// IPAddr represents the address of a IP end point.
7
// IPAddr represents the address of an IP end point.
10
8
type IPAddr struct {
10
Zone string // IPv6 scoped addressing zone
14
13
// Network returns the address's network name, "ip".
21
return a.IP.String() + "%" + a.Zone
21
23
return a.IP.String()
24
// ResolveIPAddr parses addr as a IP address and resolves domain
25
// names to numeric addresses on the network net, which must be
26
// "ip", "ip4" or "ip6". A literal IPv6 host address must be
27
// enclosed in square brackets, as in "[::]".
26
// ResolveIPAddr parses addr as an IP address of the form "host" or
27
// "ipv6-host%zone" and resolves the domain name on the network net,
28
// which must be "ip", "ip4" or "ip6".
28
29
func ResolveIPAddr(net, addr string) (*IPAddr, error) {
29
ip, err := hostToIP(net, addr)
33
return &IPAddr{ip}, nil
36
// Convert "host" into IP address.
37
func hostToIP(net, host string) (ip IP, err error) {
39
// Try as an IP address.
43
if net != "" && net[len(net)-1] == '4' {
46
if net != "" && net[len(net)-1] == '6' {
49
// Not an IP address. Try as a DNS name.
50
addrs, err1 := LookupHost(host)
55
addr = firstFavoriteAddr(filter, addrs)
58
err = &AddrError{"LookupHost returned no suitable address", addrs[0]}
30
if net == "" { // a hint wildcard for Go 1.0 undocumented behavior
33
afnet, _, err := parseNetwork(net)
38
case "ip", "ip4", "ip6":
40
return nil, UnknownNetworkError(net)
42
a, err := resolveInternetAddr(afnet, addr, noDeadline)
46
return a.(*IPAddr), nil