The Go Programming Language

Source file src/pkg/net/dial.go

     1	// Copyright 2010 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	import "os"
     8	
     9	func resolveNetAddr(op, net, addr string) (a Addr, err os.Error) {
    10		if addr == "" {
    11			return nil, &OpError{op, net, nil, errMissingAddress}
    12		}
    13		switch net {
    14		case "tcp", "tcp4", "tcp6":
    15			a, err = ResolveTCPAddr(net, addr)
    16		case "udp", "udp4", "udp6":
    17			a, err = ResolveUDPAddr(net, addr)
    18		case "unix", "unixgram", "unixpacket":
    19			a, err = ResolveUnixAddr(net, addr)
    20		case "ip", "ip4", "ip6":
    21			a, err = ResolveIPAddr(net, addr)
    22		default:
    23			err = UnknownNetworkError(net)
    24		}
    25		if err != nil {
    26			return nil, &OpError{op, net + " " + addr, nil, err}
    27		}
    28		return
    29	}
    30	
    31	// Dial connects to the address addr on the network net.
    32	//
    33	// Known networks are "tcp", "tcp4" (IPv4-only), "tcp6" (IPv6-only),
    34	// "udp", "udp4" (IPv4-only), "udp6" (IPv6-only), "ip", "ip4"
    35	// (IPv4-only), "ip6" (IPv6-only), "unix" and "unixgram".
    36	//
    37	// For IP networks, addresses have the form host:port.  If host is
    38	// a literal IPv6 address, it must be enclosed in square brackets.
    39	// The functions JoinHostPort and SplitHostPort manipulate 
    40	// addresses in this form.
    41	//
    42	// Examples:
    43	//	Dial("tcp", "12.34.56.78:80")
    44	//	Dial("tcp", "google.com:80")
    45	//	Dial("tcp", "[de:ad:be:ef::ca:fe]:80")
    46	//
    47	func Dial(net, addr string) (c Conn, err os.Error) {
    48		addri, err := resolveNetAddr("dial", net, addr)
    49		if err != nil {
    50			return nil, err
    51		}
    52		switch ra := addri.(type) {
    53		case *TCPAddr:
    54			c, err = DialTCP(net, nil, ra)
    55		case *UDPAddr:
    56			c, err = DialUDP(net, nil, ra)
    57		case *UnixAddr:
    58			c, err = DialUnix(net, nil, ra)
    59		case *IPAddr:
    60			c, err = DialIP(net, nil, ra)
    61		default:
    62			err = UnknownNetworkError(net)
    63		}
    64		if err != nil {
    65			return nil, &OpError{"dial", net + " " + addr, nil, err}
    66		}
    67		return
    68	}
    69	
    70	// Listen announces on the local network address laddr.
    71	// The network string net must be a stream-oriented
    72	// network: "tcp", "tcp4", "tcp6", or "unix", or "unixpacket".
    73	func Listen(net, laddr string) (l Listener, err os.Error) {
    74		switch net {
    75		case "tcp", "tcp4", "tcp6":
    76			var la *TCPAddr
    77			if laddr != "" {
    78				if la, err = ResolveTCPAddr(net, laddr); err != nil {
    79					return nil, err
    80				}
    81			}
    82			l, err := ListenTCP(net, la)
    83			if err != nil {
    84				return nil, err
    85			}
    86			return l, nil
    87		case "unix", "unixpacket":
    88			var la *UnixAddr
    89			if laddr != "" {
    90				if la, err = ResolveUnixAddr(net, laddr); err != nil {
    91					return nil, err
    92				}
    93			}
    94			l, err := ListenUnix(net, la)
    95			if err != nil {
    96				return nil, err
    97			}
    98			return l, nil
    99		}
   100		return nil, UnknownNetworkError(net)
   101	}
   102	
   103	// ListenPacket announces on the local network address laddr.
   104	// The network string net must be a packet-oriented network:
   105	// "udp", "udp4", "udp6", or "unixgram".
   106	func ListenPacket(net, laddr string) (c PacketConn, err os.Error) {
   107		switch net {
   108		case "udp", "udp4", "udp6":
   109			var la *UDPAddr
   110			if laddr != "" {
   111				if la, err = ResolveUDPAddr(net, laddr); err != nil {
   112					return nil, err
   113				}
   114			}
   115			c, err := ListenUDP(net, la)
   116			if err != nil {
   117				return nil, err
   118			}
   119			return c, nil
   120		case "unixgram":
   121			var la *UnixAddr
   122			if laddr != "" {
   123				if la, err = ResolveUnixAddr(net, laddr); err != nil {
   124					return nil, err
   125				}
   126			}
   127			c, err := DialUnix(net, la, nil)
   128			if err != nil {
   129				return nil, err
   130			}
   131			return c, nil
   132		}
   133	
   134		var rawnet string
   135		if rawnet, _, err = splitNetProto(net); err != nil {
   136			switch rawnet {
   137			case "ip", "ip4", "ip6":
   138				var la *IPAddr
   139				if laddr != "" {
   140					if la, err = ResolveIPAddr(rawnet, laddr); err != nil {
   141						return nil, err
   142					}
   143				}
   144				c, err := ListenIP(net, la)
   145				if err != nil {
   146					return nil, err
   147				}
   148				return c, nil
   149			}
   150		}
   151	
   152		return nil, UnknownNetworkError(net)
   153	}

release.r60.3. Except as noted, this content is licensed under a Creative Commons Attribution 3.0 License.