| // Copyright 2010 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package net |
| |
| import ( |
| "errors" |
| "io" |
| "time" |
| ) |
| |
| // Pipe creates a synchronous, in-memory, full duplex |
| // network connection; both ends implement the Conn interface. |
| // Reads on one end are matched with writes on the other, |
| // copying data directly between the two; there is no internal |
| // buffering. |
| func Pipe() (Conn, Conn) { |
| r1, w1 := io.Pipe() |
| r2, w2 := io.Pipe() |
| |
| return &pipe{r1, w2}, &pipe{r2, w1} |
| } |
| |
| type pipe struct { |
| *io.PipeReader |
| *io.PipeWriter |
| } |
| |
| type pipeAddr int |
| |
| func (pipeAddr) Network() string { |
| return "pipe" |
| } |
| |
| func (pipeAddr) String() string { |
| return "pipe" |
| } |
| |
| func (p *pipe) Close() error { |
| err := p.PipeReader.Close() |
| err1 := p.PipeWriter.Close() |
| if err == nil { |
| err = err1 |
| } |
| return err |
| } |
| |
| func (p *pipe) LocalAddr() Addr { |
| return pipeAddr(0) |
| } |
| |
| func (p *pipe) RemoteAddr() Addr { |
| return pipeAddr(0) |
| } |
| |
| func (p *pipe) SetDeadline(t time.Time) error { |
| return errors.New("net.Pipe does not support deadlines") |
| } |
| |
| func (p *pipe) SetReadDeadline(t time.Time) error { |
| return errors.New("net.Pipe does not support deadlines") |
| } |
| |
| func (p *pipe) SetWriteDeadline(t time.Time) error { |
| return errors.New("net.Pipe does not support deadlines") |
| } |