63 lines
2.0 KiB
Python
63 lines
2.0 KiB
Python
# OSNet demux: uses the OS network stack to demultiplex incoming datagrams
|
|
# among sockets bound to the same ports. Written by Ray Brown.
|
|
"""OS Network UDP Demux
|
|
|
|
This module implements a demux that uses the OS network stack to demultiplex
|
|
datagrams coming from different peers among datagram sockets that are all bound
|
|
to the port at which these datagrams are being received. The network stack is
|
|
instructed as to which socket an incoming datagram should be sent to by
|
|
connecting the destination socket to the peer endpoint.
|
|
|
|
The OSNet demux requires operating system functionality that exists in the
|
|
Linux kernel, but not in the Windows network stack.
|
|
|
|
Classes:
|
|
|
|
UDPDemux -- a network stack configuring UDP demux
|
|
|
|
Exceptions:
|
|
|
|
KeyError -- raised for unknown peer addresses
|
|
"""
|
|
|
|
|
|
class UDPDemux(object):
|
|
"""OS network stack configuring demux
|
|
|
|
This class implements a demux that creates sockets connected to peer
|
|
network endpoints, configuring the network stack to demultiplex
|
|
incoming datagrams from these endpoints among these sockets.
|
|
|
|
Methods:
|
|
|
|
get_connection -- create a new connection or retrieve an existing one
|
|
remove_connection -- remove an existing connection
|
|
service -- this method does nothing for this type of demux
|
|
"""
|
|
|
|
def get_connection(self, address):
|
|
"""Create or retrieve a muxed connection
|
|
|
|
Arguments:
|
|
address -- a peer endpoint in IPv4/v6 address format; None refers
|
|
to the connection for unknown peers
|
|
|
|
Return:
|
|
a bound, connected datagram socket instance, or the root socket
|
|
in case address was None
|
|
"""
|
|
|
|
def remove_connection(self, address):
|
|
"""Remove a muxed connection
|
|
|
|
Arguments:
|
|
address -- an address for which a muxed connection was previously
|
|
retrieved through get_connection, which has not yet
|
|
been removed
|
|
|
|
Return:
|
|
the socket object whose connection has been removed
|
|
"""
|
|
|
|
return self.connections.pop(address)
|