mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
net: add ListenConfig, Dialer.Control to permit socket opts before listen/dial
Existing implementation does not provide a way to set options such as SO_REUSEPORT, that has to be set prior the socket being bound. New exposed API: pkg net, method (*ListenConfig) Listen(context.Context, string, string) (Listener, error) pkg net, method (*ListenConfig) ListenPacket(context.Context, string, string) (PacketConn, error) pkg net, type ListenConfig struct pkg net, type ListenConfig struct, Control func(string, string, syscall.RawConn) error pkg net, type Dialer struct, Control func(string, string, syscall.RawConn) error Fixes #9661 Change-Id: If4d275711f823df72d3ac5cc3858651a6a57cccb Reviewed-on: https://go-review.googlesource.com/72810 Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
This commit is contained in:
parent
cc6e568c81
commit
3c4d3bdd3b
12 changed files with 350 additions and 74 deletions
|
|
@ -912,6 +912,57 @@ func TestDialListenerAddr(t *testing.T) {
|
|||
c.Close()
|
||||
}
|
||||
|
||||
func TestDialerControl(t *testing.T) {
|
||||
switch runtime.GOOS {
|
||||
case "nacl", "plan9":
|
||||
t.Skipf("not supported on %s", runtime.GOOS)
|
||||
}
|
||||
|
||||
t.Run("StreamDial", func(t *testing.T) {
|
||||
for _, network := range []string{"tcp", "tcp4", "tcp6", "unix", "unixpacket"} {
|
||||
if !testableNetwork(network) {
|
||||
continue
|
||||
}
|
||||
ln, err := newLocalListener(network)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
continue
|
||||
}
|
||||
defer ln.Close()
|
||||
d := Dialer{Control: controlOnConnSetup}
|
||||
c, err := d.Dial(network, ln.Addr().String())
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
continue
|
||||
}
|
||||
c.Close()
|
||||
}
|
||||
})
|
||||
t.Run("PacketDial", func(t *testing.T) {
|
||||
for _, network := range []string{"udp", "udp4", "udp6", "unixgram"} {
|
||||
if !testableNetwork(network) {
|
||||
continue
|
||||
}
|
||||
c1, err := newLocalPacketListener(network)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
continue
|
||||
}
|
||||
if network == "unixgram" {
|
||||
defer os.Remove(c1.LocalAddr().String())
|
||||
}
|
||||
defer c1.Close()
|
||||
d := Dialer{Control: controlOnConnSetup}
|
||||
c2, err := d.Dial(network, c1.LocalAddr().String())
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
continue
|
||||
}
|
||||
c2.Close()
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// mustHaveExternalNetwork is like testenv.MustHaveExternalNetwork
|
||||
// except that it won't skip testing on non-iOS builders.
|
||||
func mustHaveExternalNetwork(t *testing.T) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue