mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-18 18:02:24 +00:00
p2p: simplify tcpPipe function
This commit is contained in:
parent
b2b9a9aa81
commit
863ad2bea8
1 changed files with 19 additions and 46 deletions
|
|
@ -604,55 +604,28 @@ func TestHandshakeForwardCompatibility(t *testing.T) {
|
|||
|
||||
// tcpPipe creates an in process full duplex pipe based on a localhost TCP socket
|
||||
func tcpPipe() (net.Conn, net.Conn, error) {
|
||||
type result struct {
|
||||
conn net.Conn
|
||||
err error
|
||||
}
|
||||
|
||||
cl := make(chan result)
|
||||
cd := make(chan result)
|
||||
|
||||
start := make(chan net.Addr)
|
||||
|
||||
go func(res chan result, start chan net.Addr) {
|
||||
// resolve
|
||||
addr, err := net.ResolveTCPAddr("tcp", "localhost:0")
|
||||
l, err := net.Listen("tcp", "127.0.0.1:0")
|
||||
if err != nil {
|
||||
res <- result{err: err}
|
||||
return
|
||||
return nil, nil, err
|
||||
}
|
||||
// listen
|
||||
l, err := net.ListenTCP("tcp", addr)
|
||||
if err != nil {
|
||||
res <- result{err: err}
|
||||
return
|
||||
}
|
||||
start <- l.Addr()
|
||||
c, err := l.AcceptTCP()
|
||||
if err != nil {
|
||||
res <- result{err: err}
|
||||
return
|
||||
}
|
||||
res <- result{conn: c}
|
||||
}(cl, start)
|
||||
defer l.Close()
|
||||
|
||||
go func(res chan result, start chan net.Addr) {
|
||||
addr := <-start
|
||||
c, err := net.DialTCP("tcp", nil, addr.(*net.TCPAddr))
|
||||
if err != nil {
|
||||
res <- result{err: err}
|
||||
return
|
||||
}
|
||||
res <- result{conn: c}
|
||||
}(cd, start)
|
||||
var aconn net.Conn
|
||||
aerr := make(chan error, 1)
|
||||
go func() {
|
||||
var err error
|
||||
aconn, err = l.Accept()
|
||||
aerr <- err
|
||||
}()
|
||||
|
||||
a := <-cl
|
||||
if a.err != nil {
|
||||
return nil, nil, a.err
|
||||
dconn, err := net.Dial("tcp", l.Addr().String())
|
||||
if err != nil {
|
||||
<-aerr
|
||||
return nil, nil, err
|
||||
}
|
||||
b := <-cd
|
||||
if b.err != nil {
|
||||
return nil, nil, b.err
|
||||
if err := <-aerr; err != nil {
|
||||
dconn.Close()
|
||||
return nil, nil, err
|
||||
}
|
||||
return a.conn, b.conn, nil
|
||||
return aconn, dconn, nil
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue