Dear Monks,
I am working on a new version of my Net::SFTP::Foreign module, an SFTP client that runs on top of the OpenSSH SSH client. In difference to other network clients, instead of talking to a socket, it talks to a pipe connected to a slave ssh process that is connected to the remote server.
To get the maximum throughput on transfers, request commands are not sent after the response to the previous one arrives but queued on an output buffer and sent from inside a select loop as soon as possible while at the same time, responses to old requests are read.
My problem is that now, I am trying to make it work under Windows, but select does not work with pipes there and I couldn't find any other way to do asynchronous bidirectional IO with a slave process.
Well, there are some alternatives but I don't like them for different reasons:
- using a named pipe: they can do asynchronous IO, but Win32::Pipe has not support for it.
- emulating socketpair opening a socket through localhost: open a TCP port for listening, connect to it from the same process (I am not sure if that is possible or will incur in a dead-lock), and inmediately close the listener again. Well, it is rather ugly and complex.
- create a new thread and use it for writting while the main one keeps reading. I don't like that solution, because under the current perl implementation, creating a new thread can be quite expensive.
- use blocking IO and queue only a very small number of request, so that they go into the pipe internal buffer and write operations do not block (that's what I am doing right now). The problem is that performance degrades and I am not sure it will not block at some time.
Is there any other solution I can use?
Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
Read Where should I post X? if you're not absolutely sure you're posting in the right place.
Please read these before you post! —
Posts may use any of the Perl Monks Approved HTML tags:
- a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
| |
For: |
|
Use: |
| & | | & |
| < | | < |
| > | | > |
| [ | | [ |
| ] | | ] |
Link using PerlMonks shortcuts! What shortcuts can I use for linking?
See Writeup Formatting Tips and other pages linked from there for more info.