github.com/aigarnetwork/aigar@v0.0.0-20191115204914-d59a6eb70f8e/p2p/simulations/pipes/pipes.go (about) 1 // Copyright 2018 The go-ethereum Authors 2 // Copyright 2019 The go-aigar Authors 3 // This file is part of the go-aigar library. 4 // 5 // The go-aigar library is free software: you can redistribute it and/or modify 6 // it under the terms of the GNU Lesser General Public License as published by 7 // the Free Software Foundation, either version 3 of the License, or 8 // (at your option) any later version. 9 // 10 // The go-aigar library is distributed in the hope that it will be useful, 11 // but WITHOUT ANY WARRANTY; without even the implied warranty of 12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 // GNU Lesser General Public License for more details. 14 // 15 // You should have received a copy of the GNU Lesser General Public License 16 // along with the go-aigar library. If not, see <http://www.gnu.org/licenses/>. 17 18 package pipes 19 20 import ( 21 "net" 22 ) 23 24 // NetPipe wraps net.Pipe in a signature returning an error 25 func NetPipe() (net.Conn, net.Conn, error) { 26 p1, p2 := net.Pipe() 27 return p1, p2, nil 28 } 29 30 // TCPPipe creates an in process full duplex pipe based on a localhost TCP socket 31 func TCPPipe() (net.Conn, net.Conn, error) { 32 l, err := net.Listen("tcp", "127.0.0.1:0") 33 if err != nil { 34 return nil, nil, err 35 } 36 defer l.Close() 37 38 var aconn net.Conn 39 aerr := make(chan error, 1) 40 go func() { 41 var err error 42 aconn, err = l.Accept() 43 aerr <- err 44 }() 45 46 dconn, err := net.Dial("tcp", l.Addr().String()) 47 if err != nil { 48 <-aerr 49 return nil, nil, err 50 } 51 if err := <-aerr; err != nil { 52 dconn.Close() 53 return nil, nil, err 54 } 55 return aconn, dconn, nil 56 }