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 5package net 6 7import ( 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. 18func Pipe() (Conn, Conn) { 19 r1, w1 := io.Pipe() 20 r2, w2 := io.Pipe() 21 22 return &pipe{r1, w2}, &pipe{r2, w1} 23} 24 25type pipe struct { 26 *io.PipeReader 27 *io.PipeWriter 28} 29 30type pipeAddr int 31 32func (pipeAddr) Network() string { 33 return "pipe" 34} 35 36func (pipeAddr) String() string { 37 return "pipe" 38} 39 40func (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 49func (p *pipe) LocalAddr() Addr { 50 return pipeAddr(0) 51} 52 53func (p *pipe) RemoteAddr() Addr { 54 return pipeAddr(0) 55} 56 57func (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 61func (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 65func (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