Bi-directional pipe?

Is there any standard Ruby way of creating a bidirectional pipe or
socketpair?

I want to pass a single IO-like object around, but to be able to both read
and write from the other end. (What I'm actually trying to do is to put a
facade around Net::SSH so that the command channel can be passed in as a
proxy to Net::Telnet, but I can think of other uses of this)

IO.popen(..., "w+") does make such a bidirectional pipe, but as far as I can
see only for communicating with a child process.

Any ideas?

Thanks,

Brian.

rd, wr = IO.pipe

comes to mind.

-Rob

Rob Biedenharn http://agileconsultingllc.com
Rob@AgileConsultingLLC.com

···

On Mar 13, 2007, at 4:15 PM, Brian Candler wrote:

Is there any standard Ruby way of creating a bidirectional pipe or
socketpair?

I want to pass a single IO-like object around, but to be able to both read
and write from the other end. (What I'm actually trying to do is to put a
facade around Net::SSH so that the command channel can be passed in as a
proxy to Net::Telnet, but I can think of other uses of this)

IO.popen(..., "w+") does make such a bidirectional pipe, but as far as I can
see only for communicating with a child process.

Any ideas?

Thanks,

Brian.

require 'socket'
Socket.pair ....

-a

···

On Wed, 14 Mar 2007, Rob Biedenharn wrote:

On Mar 13, 2007, at 4:15 PM, Brian Candler wrote:

Is there any standard Ruby way of creating a bidirectional pipe or
socketpair?

--
be kind whenever possible... it is always possible.
- the dalai lama

That's a *unidirectional* pipe. At least, all the rdoc stuff says that one
end is a reader and the other end is a writer.

···

On Wed, Mar 14, 2007 at 05:29:16AM +0900, Rob Biedenharn wrote:

On Mar 13, 2007, at 4:15 PM, Brian Candler wrote:
>Is there any standard Ruby way of creating a bidirectional pipe or
>socketpair?
>
>I want to pass a single IO-like object around, but to be able to
>both read
>and write from the other end. (What I'm actually trying to do is to
>put a
>facade around Net::SSH so that the command channel can be passed in
>as a
>proxy to Net::Telnet, but I can think of other uses of this)
>
>IO.popen(..., "w+") does make such a bidirectional pipe, but as far
>as I can
>see only for communicating with a child process.
>
>Any ideas?
>
>Thanks,
>
>Brian.

rd, wr = IO.pipe

comes to mind.

>>Is there any standard Ruby way of creating a bidirectional pipe or
>>socketpair?

require 'socket'
Socket.pair ....

irb(main):015:0> require 'socket'
=> true
irb(main):016:0> a = Socket.pair
ArgumentError: wrong number of arguments (0 for 3)
        from (irb):16:in `pair'
        from (irb):16

OK, so it exists, it's just not documented in ri - time to grep the source I
guess. Thanks for the pointer.

···

On Wed, Mar 14, 2007 at 05:35:52AM +0900, ara.t.howard@noaa.gov wrote:

On Wed, 14 Mar 2007, Rob Biedenharn wrote:
>On Mar 13, 2007, at 4:15 PM, Brian Candler wrote:

        from :0

http://groups.google.com/group/comp.lang.ruby/browse_frm/thread/26d3538da0410b8b/fdc3c5c6686ceb49?lnk=gst&q=Socket.pair&rnum=2&hl=en#fdc3c5c6686ceb49

http://groups.google.com/group/comp.lang.ruby/browse_frm/thread/735d4f73074db10f/5a38eadb8db2d832?lnk=gst&q=Socket.pair&rnum=3&hl=en#5a38eadb8db2d832

regards.

-a

···

On Wed, 14 Mar 2007, Brian Candler wrote:

On Wed, Mar 14, 2007 at 05:35:52AM +0900, ara.t.howard@noaa.gov wrote:

On Wed, 14 Mar 2007, Rob Biedenharn wrote:

On Mar 13, 2007, at 4:15 PM, Brian Candler wrote:

Is there any standard Ruby way of creating a bidirectional pipe or
socketpair?

require 'socket'
Socket.pair ....

irb(main):015:0> require 'socket'
=> true
irb(main):016:0> a = Socket.pair
ArgumentError: wrong number of arguments (0 for 3)
       from (irb):16:in `pair'
       from (irb):16
       from :0

OK, so it exists, it's just not documented in ri - time to grep the source I
guess. Thanks for the pointer.

--
be kind whenever possible... it is always possible.
- the dalai lama