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.