def connect(self): """ Create a TCP socket connection. Returns True if the socket needed connecting, False if not """ if self._sock is not None: self.logger.debug("connect() called, but already connected") return False try: sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) if self.settings.ssl: sock = ssl.wrap_socket(sock, **self.settings.ssl_kwargs) if self.settings.socket_timeout is not None: sock.settimeout(self.settings.socket_timeout) self.logger.info("connecting with new socket to %s:%s", self.settings.host, self.settings.port) sock.connect((self.settings.host, self.settings.port)) if self.settings.tcp_nodelay: sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) except socket.error as exc: reraise(ConnectionError(self._error_message(exc))) self._sock = sock return True
def connect(self): """ Create a TCP socket connection. Returns True if the socket needed connecting, False if not """ if self._sock is not None: self.logger.debug("connect() called, but already connected") return False try: sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) if self.settings.ssl: sock = ssl.wrap_socket(sock, **self.settings.ssl_kwargs) if self.settings.socket_timeout is not None: sock.settimeout(self.settings.socket_timeout) self.logger.info( "connecting with new socket to %s:%s", self.settings.host, self.settings.port) sock.connect((self.settings.host, self.settings.port)) if self.settings.tcp_nodelay: sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) except socket.error as exc: reraise(ConnectionError(self._error_message(exc))) self._sock = sock return True
def send(self, byte_array): """ :type byte_array: bytearray :return: Number of sent bytes :rtype: int """ if self._sock is None: raise SocketDisconnected('Trying to write to socket when disconnected') try: self.wire_logger.debug("sending %d bytes: %r", len(byte_array), byte_array) sent = self._sock.send(byte_array) if sent == 0: raise SocketDisconnected('Socket disconnected when writing to it, 0 bytes written') return sent except socket.error as e: reraise(ConnectionError("Error while writing to socket", e))
def send(self, msg_bytes): "Send a payload" if self._sock is None: raise SocketDisconnected('Trying to write to socket when disconnected') byte_count = len(msg_bytes) # Pad to 4 bytes padding = '\x00' * max(0, 3 - byte_count) self.logger.debug( "payload has %d bytes and needs %d padding", byte_count, len(padding)) frame = _encode_varint(byte_count) + msg_bytes + padding try: self.wire_logger.debug("sending frame bytes %r", frame) self._sock.sendall(frame) except socket.error as e: reraise(ConnectionError("Error while writing to socket", e))
def send(self, data): """ :type data: byte string :return: Number of sent bytes :rtype: int """ if self._sock is None: raise SocketDisconnected( 'Trying to write to socket when disconnected') try: self.wire_logger.debug("sending %d bytes: %r", len(data), data) sent = self._sock.send(data) if sent == 0: raise SocketDisconnected( 'Socket disconnected when writing to it, 0 bytes written') return sent except socket.error as e: reraise(ConnectionError("Error while writing to socket", e))
def recv(self): """Read stuff from underlying socket. :rtype: byte string """ if self._sock is None: raise SocketDisconnected("Trying to read from a socket when disconnected") try: inbytes = self._sock.recv(self.settings.read_chunksize) if not inbytes: message = "Socket disconnected while receiving, got %r" % (inbytes,) self.logger.info(message) raise SocketDisconnected(message) self.wire_logger.debug("Received %d bytes: %r", len(inbytes), inbytes) return inbytes except socket.error as e: reraise(ConnectionError("Error while reading from socket", e))
def _fill_buffer(self, min_size=4, empty=False): "Ensure the buffer has at least 4 bytes" if self._sock is None: raise SocketDisconnected( 'Trying to read from a socket when disconnected') if empty: self._buffer = '' while len(self._buffer) < min_size: bytes_needed = min_size - len(self._buffer) self.logger.debug("receiving %d bytes", bytes_needed) try: if self.settings.ssl: inbytes = self._recv_msg_ssl(bytes_needed) else: inbytes = self._recv_msg_sock(bytes_needed) except socket.error as e: reraise(ConnectionError('Error while reading from socket', e)) self._buffer += inbytes
def recv(self): """Read stuff from underlying socket. :rtype: byte string """ if self._sock is None: raise SocketDisconnected( 'Trying to read from a socket when disconnected') try: inbytes = self._sock.recv(self.settings.read_chunksize) if not inbytes: message = "Socket disconnected while receiving, got %r" % ( inbytes, ) self.logger.info(message) raise SocketDisconnected(message) self.wire_logger.debug('Received %d bytes: %r', len(inbytes), inbytes) return inbytes except socket.error as e: reraise(ConnectionError('Error while reading from socket', e))