- # Header and message
- try:
- msg = self.socket.recv(4096)
- if len(msg) == 0:
- return None
- except socket.error as message:
- logging.error(message)
- raise
-
- (_, l, _) = self.header.unpack(msg[:16])
-
- if l > len(msg):
- buf = bytearray(l + 16)
- view = memoryview(buf)
- view[:4096] = msg
- view = view[4096:]
- # Read rest of message
- remaining_bytes = l - 4096 + 16
- while remaining_bytes > 0:
- bytes_to_read = (remaining_bytes if remaining_bytes
- <= 4096 else 4096)
- nbytes = self.socket.recv_into(view, bytes_to_read)
- if nbytes == 0:
- logging.error('recv failed')
- break
- view = view[nbytes:]
- remaining_bytes -= nbytes
- else:
- buf = msg
- return buf[16:]
-
- def read(self):
+ """Read single complete message, return it or empty on error."""
+ hdr = self._read_fixed(16)
+ if not hdr:
+ return
+ (_, hdrlen, _) = self.header.unpack(hdr) # If at head of message
+
+ # Read rest of message
+ msg = self._read_fixed(hdrlen)
+ if hdrlen == len(msg):
+ return msg
+ raise VppTransportSocketIOError(1, "Unknown socket read error")
+
+ def read(self, timeout=None):