Part of twisted.internet.interfaces View Source View In Hierarchy
Known implementations: twisted.internet.posixbase.PosixReactorBase
Methods which allow a reactor to use externally created sockets.
For example, to use adoptStreamPort
to implement behavior
equivalent to that of IReactorTCP.listenTCP
,
you might write code like this:
from socket import SOMAXCONN, AF_INET, SOCK_STREAM, socket portSocket = socket(AF_INET, SOCK_STREAM) # Set FD_CLOEXEC on port, left as an exercise. Then make it into a # non-blocking listening port: portSocket.setblocking(False) portSocket.bind(('192.168.1.2', 12345)) portSocket.listen(SOMAXCONN) # Now have the reactor use it as a TCP port port = reactor.adoptStreamPort( portSocket.fileno(), AF_INET, YourFactory()) # portSocket itself is no longer necessary, and needs to be cleaned # up by us. portSocket.close() # Whenever the server is no longer needed, stop it as usual. stoppedDeferred = port.stopListening()
Another potential use is to inherit a listening descriptor from a parent process (for example, systemd or launchd), or to receive one over a UNIX domain socket.
Some plans for extending this interface exist. See:
Method | adoptStreamPort | Add an existing listening SOCK_STREAM socket to the reactor to monitor for new connections to accept and handle. |
Method | adoptStreamConnection | Add an existing connected SOCK_STREAM socket to the reactor to monitor for data. |
Method | adoptDatagramPort | Add an existing listening SOCK_DGRAM socket to the reactor to monitor for read and write readiness. |
Parameters | fileDescriptor | A file descriptor associated with a socket which is already bound to an
address and marked as listening. The socket must be set non-blocking. Any
additional flags (for example, close-on-exec) must also be set by
application code. Application code is responsible for closing the file
descriptor, which may be done as soon as adoptStreamPort
returns. (type: int ) |
addressFamily | The address family (or domain) of the socket. For example, socket.AF_INET6 . | |
factory | A ServerFactory
instance to use to create new protocols to handle connections accepted via
this socket. | |
Returns | An object providing IListeningPort . | |
Raises | twisted.internet.error.UnsupportedAddressFamily | If the given address family is not supported by this reactor, or not supported with the given socket type. |
twisted.internet.error.UnsupportedSocketType | If the given socket type is not supported by this reactor, or not supported with the given socket type. |
Note that the given factory won't have its startFactory
and
stopFactory
methods called, as there is no sensible time to
call them in this situation.
Parameters | fileDescriptor | A file descriptor associated with a socket which is already connected. The
socket must be set non-blocking. Any additional flags (for example,
close-on-exec) must also be set by application code. Application code is
responsible for closing the file descriptor, which may be done as soon as
adoptStreamConnection returns. (type: int ) |
addressFamily | The address family (or domain) of the socket. For example, socket.AF_INET6 . | |
factory | A ServerFactory
instance to use to create a new protocol to handle the connection via this
socket. | |
Raises | UnsupportedAddressFamily | If the given address family is not supported by this reactor, or not supported with the given socket type. |
UnsupportedSocketType | If the given socket type is not supported by this reactor, or not supported with the given socket type. |
Add an existing listening I{SOCK_DGRAM} socket to the reactor to monitor for read and write readiness. @param fileDescriptor: A file descriptor associated with a socket which is already bound to an address and marked as listening. The socket must be set non-blocking. Any additional flags (for example, close-on-exec) must also be set by application code. Application code is responsible for closing the file descriptor, which may be done as soon as C{adoptDatagramPort} returns. @type fileDescriptor: C{int} @param addressFamily: The address family (or I{domain}) of the socket. For example, L{socket.AF_INET6}. @type addressFamily: C{int} @param protocol: A L{DatagramProtocol} instance to connect to a UDP transport. @type protocol: L{DatagramProtocol} @param maxPacketSize: The maximum packet size to accept. @type maxPacketSize: C{int} @return: An object providing L{IListeningPort}. @raise L{UnsupportedAddressFamily}: If the given address family is not supported by this reactor, or not supported with the given socket type. @raise UnsupportedSocketType: If the given socket type is not supported by this reactor, or not supported with the given socket type.