Home | History | Annotate | Download | only in net
      1 // Copyright 2009 The Go Authors.  All rights reserved.
      2 // Use of this source code is governed by a BSD-style
      3 // license that can be found in the LICENSE file.
      4 
      5 package net
      6 
      7 // TCPAddr represents the address of a TCP end point.
      8 type TCPAddr struct {
      9 	IP   IP
     10 	Port int
     11 	Zone string // IPv6 scoped addressing zone
     12 }
     13 
     14 // Network returns the address's network name, "tcp".
     15 func (a *TCPAddr) Network() string { return "tcp" }
     16 
     17 func (a *TCPAddr) String() string {
     18 	if a == nil {
     19 		return "<nil>"
     20 	}
     21 	ip := ipEmptyString(a.IP)
     22 	if a.Zone != "" {
     23 		return JoinHostPort(ip+"%"+a.Zone, itoa(a.Port))
     24 	}
     25 	return JoinHostPort(ip, itoa(a.Port))
     26 }
     27 
     28 func (a *TCPAddr) isWildcard() bool {
     29 	if a == nil || a.IP == nil {
     30 		return true
     31 	}
     32 	return a.IP.IsUnspecified()
     33 }
     34 
     35 func (a *TCPAddr) opAddr() Addr {
     36 	if a == nil {
     37 		return nil
     38 	}
     39 	return a
     40 }
     41 
     42 // ResolveTCPAddr parses addr as a TCP address of the form "host:port"
     43 // or "[ipv6-host%zone]:port" and resolves a pair of domain name and
     44 // port name on the network net, which must be "tcp", "tcp4" or
     45 // "tcp6".  A literal address or host name for IPv6 must be enclosed
     46 // in square brackets, as in "[::1]:80", "[ipv6-host]:http" or
     47 // "[ipv6-host%zone]:80".
     48 func ResolveTCPAddr(net, addr string) (*TCPAddr, error) {
     49 	switch net {
     50 	case "tcp", "tcp4", "tcp6":
     51 	case "": // a hint wildcard for Go 1.0 undocumented behavior
     52 		net = "tcp"
     53 	default:
     54 		return nil, UnknownNetworkError(net)
     55 	}
     56 	addrs, err := internetAddrList(net, addr, noDeadline)
     57 	if err != nil {
     58 		return nil, err
     59 	}
     60 	return addrs.first(isIPv4).(*TCPAddr), nil
     61 }
     62