github.com/linapex/ethereum-dpos-chinese@v0.0.0-20190316121959-b78b3a4a1ece/p2p/simulations/pipes/pipes.go (about) 1 2 //<developer> 3 // <name>linapex 曹一峰</name> 4 // <email>linapex@163.com</email> 5 // <wx>superexc</wx> 6 // <qqgroup>128148617</qqgroup> 7 // <url>https://jsq.ink</url> 8 // <role>pku engineer</role> 9 // <date>2019-03-16 12:09:45</date> 10 //</624342661779689472> 11 12 13 package pipes 14 15 import ( 16 "net" 17 ) 18 19 //net pipe在返回错误的签名中包装net.pipe 20 func NetPipe() (net.Conn, net.Conn, error) { 21 p1, p2 := net.Pipe() 22 return p1, p2, nil 23 } 24 25 //tcp pipe基于本地主机tcp套接字创建进程内全双工管道 26 func TCPPipe() (net.Conn, net.Conn, error) { 27 l, err := net.Listen("tcp", "127.0.0.1:0") 28 if err != nil { 29 return nil, nil, err 30 } 31 defer l.Close() 32 33 var aconn net.Conn 34 aerr := make(chan error, 1) 35 go func() { 36 var err error 37 aconn, err = l.Accept() 38 aerr <- err 39 }() 40 41 dconn, err := net.Dial("tcp", l.Addr().String()) 42 if err != nil { 43 <-aerr 44 return nil, nil, err 45 } 46 if err := <-aerr; err != nil { 47 dconn.Close() 48 return nil, nil, err 49 } 50 return aconn, dconn, nil 51 } 52