1 // Copyright 2010 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package net 6 7 import ( 8 "errors" 9 "io" 10 "time" 11 ) 12 13 // Pipe creates a synchronous, in-memory, full duplex 14 // network connection; both ends implement the Conn interface. 15 // Reads on one end are matched with writes on the other, 16 // copying data directly between the two; there is no internal 17 // buffering. 18 func Pipe() (Conn, Conn) { 19 r1, w1 := io.Pipe() 20 r2, w2 := io.Pipe() 21 22 return &pipe{r1, w2}, &pipe{r2, w1} 23 } 24 25 type pipe struct { 26 *io.PipeReader 27 *io.PipeWriter 28 } 29 30 type pipeAddr int 31 32 func (pipeAddr) Network() string { 33 return "pipe" 34 } 35 36 func (pipeAddr) String() string { 37 return "pipe" 38 } 39 40 func (p *pipe) Close() error { 41 err := p.PipeReader.Close() 42 err1 := p.PipeWriter.Close() 43 if err == nil { 44 err = err1 45 } 46 return err 47 } 48 49 func (p *pipe) LocalAddr() Addr { 50 return pipeAddr(0) 51 } 52 53 func (p *pipe) RemoteAddr() Addr { 54 return pipeAddr(0) 55 } 56 57 func (p *pipe) SetDeadline(t time.Time) error { 58 return &OpError{Op: "set", Net: "pipe", Source: nil, Addr: nil, Err: errors.New("deadline not supported")} 59 } 60 61 func (p *pipe) SetReadDeadline(t time.Time) error { 62 return &OpError{Op: "set", Net: "pipe", Source: nil, Addr: nil, Err: errors.New("deadline not supported")} 63 } 64 65 func (p *pipe) SetWriteDeadline(t time.Time) error { 66 return &OpError{Op: "set", Net: "pipe", Source: nil, Addr: nil, Err: errors.New("deadline not supported")} 67 } 68