[Twisted-Python] What is the minimum effort solution to make inetd-managed twisted-based application?
exarkun at twistedmatrix.com
exarkun at twistedmatrix.com
Tue Jul 13 08:37:08 MDT 2010
On 12:57 pm, twisted-web at udmvt.ru wrote:
>What is the minimal effort method for building protocol instance (maybe
>out of
>already implemented protocol factory) using a transport, that uses
>parent-inherited sockets (or any other already connected sockets) ?
>I haven't yet found any single-line solution for that.
This isn't supported, but we'd like to support it. There's a ticket in
the issue tracker, <http://twistedmatrix.com/trac/ticket/4387>, related
to this (but with a somewhat wider scope).
>For example, how to start an inetd-managed SMTP server (with STARTTLS
>support),
>suppose, we have protocol (and factory) already implemented, but
>how to construct the correct transport out of fd with the minimal
>effort?
>
>Or how to implement ucspi-tcp's tcpclient client on top of twisted
>framework?
>
>Right now I am looking at t.i.unix.Connector and t.i.unix.Port to
>understand
>how do transports get constructed by them, but well, that is too
>complex for a single evening.
>Should I really get into the details of implementing my own transport
>(or their constructors)
>to do what I need? I'm sure there should be something, that I missed in
>the documentation
>(or in the code?).
Despite not appearing to be private, things like t.i.unix.Connector and
t.i.unix.Port aren't really intended for use by applications.
This is the right part of Twisted to be looking at if you want to
contribute a patch which adds this feature, though. And I encourage you
to do that. :)
The implementation should be fairly straight-forward. Most things like
Port and Client and Server have a "createInternetSocket" method. All
that's really necessary to use an externally created file descriptor is
get "createInternetSocket" to return that descriptor instead of creating
a new one (or skip the call to the method entirely and just use the
descriptor you have already).
The biggest question I have is what the API should look like. Somehow
the file descriptor needs to get from your application code (which knows
that inetd put an open TCP connection on fd 0) to the
Port/Client/Server.
The obvious options, adding another argument to
listen/connectTCP/UNIX/etc, would work, but is somewhat ugly (you have
the issue that existing mandatory arguments would just be ignored).
Another idea would be adding new methods entirely. I don't know if
that's much better, though.
So, if we can come up with a nice API, I think this will be a pretty
quick feature to implement.
>And by the way, I haven't found any socketpair(2) usage in the twisted
>framework (except for tests),
>how can that be? Transport based on socketpair sockets will have the
>same
>implementation, as I need. Is it true, that nobody in twisted community
>uses
>anonymous preconnected sockets in real life?
Apparently. :)
>
>PS: I need socket-based transport, that is, full-duplex, half-
>closeable, with support
>of getting the remote endpoint address and with ability to start TLS on
>top of it
>and without implementing every that feature myself :)
Hopefully if we can figure out how to create a Twisted transport object
from an existing file descriptor, you should have no trouble with the
rest of these.
>Thanks for a great framework!
You're welcome, and thanks! :)
Jean-Paul
More information about the Twisted-Python
mailing list