mirror of
https://github.com/golang/go
synced 2024-10-05 16:51:21 -06:00
2ddcad96d7
This CL will help to make an adaptive address family selection possible when an any address family, vague network string such as "ip", "tcp" or "udp" is passed to Dial and Listen API. Fixes #1769. R=bradfitz, rsc CC=golang-dev https://golang.org/cl/4438066
162 lines
3.7 KiB
Go
162 lines
3.7 KiB
Go
// Copyright 2010 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package net
|
|
|
|
import "os"
|
|
|
|
// Dial connects to the address addr on the network net.
|
|
//
|
|
// Known networks are "tcp", "tcp4" (IPv4-only), "tcp6" (IPv6-only),
|
|
// "udp", "udp4" (IPv4-only), "udp6" (IPv6-only), "ip", "ip4"
|
|
// (IPv4-only), "ip6" (IPv6-only), "unix" and "unixgram".
|
|
//
|
|
// For IP networks, addresses have the form host:port. If host is
|
|
// a literal IPv6 address, it must be enclosed in square brackets.
|
|
// The functions JoinHostPort and SplitHostPort manipulate
|
|
// addresses in this form.
|
|
//
|
|
// Examples:
|
|
// Dial("tcp", "12.34.56.78:80")
|
|
// Dial("tcp", "google.com:80")
|
|
// Dial("tcp", "[de:ad:be:ef::ca:fe]:80")
|
|
//
|
|
func Dial(net, addr string) (c Conn, err os.Error) {
|
|
raddr := addr
|
|
if raddr == "" {
|
|
return nil, &OpError{"dial", net, nil, errMissingAddress}
|
|
}
|
|
switch net {
|
|
case "tcp", "tcp4", "tcp6":
|
|
var ra *TCPAddr
|
|
if ra, err = ResolveTCPAddr(net, raddr); err != nil {
|
|
goto Error
|
|
}
|
|
c, err := DialTCP(net, nil, ra)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return c, nil
|
|
case "udp", "udp4", "udp6":
|
|
var ra *UDPAddr
|
|
if ra, err = ResolveUDPAddr(net, raddr); err != nil {
|
|
goto Error
|
|
}
|
|
c, err := DialUDP(net, nil, ra)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return c, nil
|
|
case "unix", "unixgram", "unixpacket":
|
|
var ra *UnixAddr
|
|
if ra, err = ResolveUnixAddr(net, raddr); err != nil {
|
|
goto Error
|
|
}
|
|
c, err = DialUnix(net, nil, ra)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return c, nil
|
|
case "ip", "ip4", "ip6":
|
|
var ra *IPAddr
|
|
if ra, err = ResolveIPAddr(net, raddr); err != nil {
|
|
goto Error
|
|
}
|
|
c, err := DialIP(net, nil, ra)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return c, nil
|
|
|
|
}
|
|
err = UnknownNetworkError(net)
|
|
Error:
|
|
return nil, &OpError{"dial", net + " " + raddr, nil, err}
|
|
}
|
|
|
|
// Listen announces on the local network address laddr.
|
|
// The network string net must be a stream-oriented
|
|
// network: "tcp", "tcp4", "tcp6", or "unix", or "unixpacket".
|
|
func Listen(net, laddr string) (l Listener, err os.Error) {
|
|
switch net {
|
|
case "tcp", "tcp4", "tcp6":
|
|
var la *TCPAddr
|
|
if laddr != "" {
|
|
if la, err = ResolveTCPAddr(net, laddr); err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
l, err := ListenTCP(net, la)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return l, nil
|
|
case "unix", "unixpacket":
|
|
var la *UnixAddr
|
|
if laddr != "" {
|
|
if la, err = ResolveUnixAddr(net, laddr); err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
l, err := ListenUnix(net, la)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return l, nil
|
|
}
|
|
return nil, UnknownNetworkError(net)
|
|
}
|
|
|
|
// ListenPacket announces on the local network address laddr.
|
|
// The network string net must be a packet-oriented network:
|
|
// "udp", "udp4", "udp6", or "unixgram".
|
|
func ListenPacket(net, laddr string) (c PacketConn, err os.Error) {
|
|
switch net {
|
|
case "udp", "udp4", "udp6":
|
|
var la *UDPAddr
|
|
if laddr != "" {
|
|
if la, err = ResolveUDPAddr(net, laddr); err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
c, err := ListenUDP(net, la)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return c, nil
|
|
case "unixgram":
|
|
var la *UnixAddr
|
|
if laddr != "" {
|
|
if la, err = ResolveUnixAddr(net, laddr); err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
c, err := DialUnix(net, la, nil)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return c, nil
|
|
}
|
|
|
|
var rawnet string
|
|
if rawnet, _, err = splitNetProto(net); err != nil {
|
|
switch rawnet {
|
|
case "ip", "ip4", "ip6":
|
|
var la *IPAddr
|
|
if laddr != "" {
|
|
if la, err = ResolveIPAddr(rawnet, laddr); err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
c, err := ListenIP(net, la)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return c, nil
|
|
}
|
|
}
|
|
|
|
return nil, UnknownNetworkError(net)
|
|
}
|