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.
5 // +build darwin freebsd linux netbsd openbsd windows
14 var listenerBacklog
= maxListenerBacklog()
16 // Generic POSIX socket creation.
17 func socket(net
string, f
, t
, p
int, ipv6only
bool, ulsa
, ursa syscall
.Sockaddr
, deadline time
.Time
, toAddr
func(syscall
.Sockaddr
) Addr
) (fd
*netFD
, err error
) {
18 s
, err
:= sysSocket(f
, t
, p
)
23 if err
= setDefaultSockopts(s
, f
, t
, ipv6only
); err
!= nil {
28 // This socket is used by a listener.
29 if ulsa
!= nil && ursa
== nil {
30 // We provide a socket that listens to a wildcard
31 // address with reusable UDP port when the given ulsa
32 // is an appropriate UDP multicast address prefix.
33 // This makes it possible for a single UDP listener
34 // to join multiple different group addresses, for
35 // multiple UDP listeners that listen on the same UDP
36 // port to join the same group address.
37 if ulsa
, err
= listenerSockaddr(s
, f
, ulsa
, toAddr
); err
!= nil {
44 if err
= syscall
.Bind(s
, ulsa
); err
!= nil {
50 if fd
, err
= newFD(s
, f
, t
, net
); err
!= nil {
55 // This socket is used by a dialer.
57 if !deadline
.IsZero() {
58 setWriteDeadline(fd
, deadline
)
60 if err
= fd
.connect(ulsa
, ursa
); err
!= nil {
65 if !deadline
.IsZero() {
66 setWriteDeadline(fd
, time
.Time
{})
70 lsa
, _
:= syscall
.Getsockname(s
)
72 rsa
, _
:= syscall
.Getpeername(s
)
77 fd
.setAddr(laddr
, raddr
)