You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
36 lines
1.0 KiB
Python
36 lines
1.0 KiB
Python
import socket, ssl
|
|
|
|
class Server:
|
|
reactor = None
|
|
|
|
def __init__(self, interface, port, client_class, use_ssl=False, **kwargs):
|
|
self.interface = interface
|
|
self.port = port
|
|
self.objtype = "server"
|
|
self.ssl = use_ssl
|
|
self.client_class = client_class
|
|
|
|
if self.ssl == True and (kwargs.haskey('certfile') == False or kwargs.hasfile('keyfile') == False):
|
|
raise Exception("SSL mode requires both a certificate and a keyfile.")
|
|
|
|
try:
|
|
self.certificate = kwargs['certfile']
|
|
self.keyfile = kwargs['keyfile']
|
|
except KeyError, e:
|
|
pass
|
|
|
|
self.stream = socket.socket()
|
|
self.stream.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
|
self.stream.bind((self.interface, self.port))
|
|
self.stream.listen(5)
|
|
|
|
def spawn_client(self, connection, source):
|
|
if self.ssl == True:
|
|
new_socket = ssl.wrap_socket(connection, server_side=True, certfile=self.certificate, keyfile=self.keyfile, ssl_version=ssl.PROTOCOL_TLSv1)
|
|
else:
|
|
new_socket = connection
|
|
|
|
return self.client_class(conn=connection, source=source)
|
|
|
|
|