#=============================================================== # --- (Un)Pack msg length and msg itself --- #=============================================================== from struct import * import asyncio, socket def send_msg(sock, msg): # Prefix each message with a 4-byte length (network byte order) msg = struct.pack('>I', len(msg)) + msg sock.sendall(msg) def send_msg_async(writer, msg): # Prefix each message with a 4-byte length (network byte order) msg = struct.pack('>I', len(msg)) + msg writer.write(msg) #sock.sendall(msg) def recv_msg(reader): # Read message length and unpack it into an integer raw_msglen = reader.read(255) if not raw_msglen: return None msglen = unpack('>I', raw_msglen)[0] # Read the message data return recvall(reader) def recvall(reader, n): # Helper function to recv n bytes or return None if EOF is hit data = bytearray() while len(data) < n: packet = reader.read(n - len(data)) if not packet: return None data.extend(packet) return data