class ConnectHandler(object): def __init__(self, addr, requestor): self._requestor = requestor self._reactor = Reactor() self._addr = addr try: self._socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self._socket.setblocking(0) self._socket.connect(addr) except socket.error: err = self._socket.getsockopt(socket.SOL_SOCKET, socket.SO_ERROR) if err != 0 and err != errno.EINPROGRESS: self._socket.close() logger.debug("Connection failed: {0}\n".format(err)) requestor.connection_failed(addr) return self._reactor.register_for_write_events(self) def stream(self): return self._socket def write_event(self): self._reactor.unregister_for_write_events(self) err = self._socket.getsockopt(socket.SOL_SOCKET, socket.SO_ERROR) if err == 0: logger.info("Connection established with {0}" .format(str(self._addr))) self._requestor.connection_complete(self._addr, self._socket) elif err != 0 and err != errno.EINPROGRESS: logger.info("Connection establishment failed with {0}" .format(str(self._addr))) self._requestor.connection_failed(self._addr)
class ConnectHandler(object): def __init__(self, addr, requestor): self._requestor = requestor self._reactor = Reactor() self._addr = addr try: self._socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self._socket.setblocking(0) self._socket.connect(addr) except socket.error: err = self._socket.getsockopt(socket.SOL_SOCKET, socket.SO_ERROR) if err != 0 and err != errno.EINPROGRESS: self._socket.close() logger.debug("Connection failed: {0}\n".format(err)) requestor.connection_failed(addr) return self._reactor.register_for_write_events(self) def stream(self): return self._socket def write_event(self): self._reactor.unregister_for_write_events(self) err = self._socket.getsockopt(socket.SOL_SOCKET, socket.SO_ERROR) if err == 0: logger.info("Connection established with {0}".format( str(self._addr))) self._requestor.connection_complete(self._addr, self._socket) elif err != 0 and err != errno.EINPROGRESS: logger.info("Connection establishment failed with {0}".format( str(self._addr))) self._requestor.connection_failed(self._addr)
class SocketReaderWriter(object): def __init__(self, sock): self._reactor = Reactor() self._receiver = None self._output = [] self._socket = sock self._reactor.register_for_read_events(self) def stream(self): return self._socket def stop(self): self._reactor.unregister_for_read_events(self) self._reactor.unregister_for_write_events(self) def set_receiver(self, receiver): self._receiver = receiver def unset_receiver(self): self._receiver = None def read_event(self): if self._receiver: view, size = self._receiver.get_rx_buffer() try: num = self._socket.recv_into(view, size) if num > 0: self._receiver.rx_bytes(num) else: if self._receiver: self._receiver.connection_lost() except socket.error as err: logger.info("Socket Error {}".format(err)) self._receiver.connection_lost() def write_event(self): if self._output == []: self._reactor.unregister_for_write_events(self) else: while self._output != []: num = self._socket.send(self._output[0]) if num == len(self._output[0]): del self._output[0] else: self._output[0] = self._output[0][num:] break def tx_bytes(self, bytestr): self._output.append(bytestr) if len(self._output) == 1: self._reactor.register_for_write_events(self)
class SocketReaderWriter(object): def __init__(self, sock): self._reactor = Reactor() self._receiver = None self._output = [] self._socket = sock self._reactor.register_for_read_events(self) def stream(self): return self._socket def stop(self): self._reactor.unregister_for_read_events(self) self._reactor.unregister_for_write_events(self) def set_receiver(self, receiver): self._receiver = receiver def unset_receiver(self): self._receiver = None def read_event(self): if self._receiver: view, size = self._receiver.get_rx_buffer() try: n = self._socket.recv_into(view, size) if n > 0: self._receiver.rx_bytes(n) else: if self._receiver: self._receiver.connection_lost() except socket.error as err: logger.info("Socket Error {}".format(err)) self._receiver.connection_lost() def write_event(self): if self._output == []: self._reactor.unregister_for_write_events(self) else: while self._output != []: n = self._socket.send(self._output[0]) if n == len(self._output[0]): del self._output[0] else: self._output[0] = self._output[0][n:] break def tx_bytes(self, bytestr): self._output.append(bytestr) if len(self._output) == 1: self._reactor.register_for_write_events(self)