package main import ( "fmt" "net" ) func main() { ln, err := net.Listen("tcp4", "127.0.0.1:0") if err != nil { fmt.Printf("Listen failed: %v\n", err) return } defer ln.Close() ch := make(chan error, 1) go func() { c, err := ln.Accept() if err != nil { ch <- fmt.Errorf("Accept failed: %v\n", err) return } defer c.Close() ch <- nil }() laddr, err := net.ResolveTCPAddr("tcp4", "127.0.0.1:0") if err != nil { fmt.Printf("ResolveTCPAddr failed: %v\n", err) return } d := &net.Dialer{LocalAddr: laddr} c, err := d.Dial("tcp4", ln.Addr().String()) if err != nil { fmt.Printf("Dial failed: %v\n", err) return } defer c.Close() c.Read(make([]byte, 1)) err = <-ch if err != nil { fmt.Println(err) } }