def send(self, data, wait_for_response):
# header consists of magic "PBAU" sequence
# + protocol version (byte, currently 1)
# + domain id (integer)
# + message size (short)
# + connection id (int, user definable, defaults to 0)
# + protocol flag (byte, 0 for TCP)
# + checksum (byte)
header = struct.pack("!BlhlB", 1, self.domain, len(data), 0, 0)
checksum = struct.pack("!B", sum(bytearray(header)) % 255)
self.__sock.sendall(b'PBAU' + header + checksum + bytes(data))
if wait_for_response:
# receive only header (17 bytes)
# TODO # WARNING: This does not take into account
# TODO # cases where socket.recv returns less than 16
# TODO # in practice this will never happen though.
header = self.__sock.recv(17)
# check for magic bytes...
if header[0:4] == b'PBAU':
# ...then parse the rest
header_parsed = struct.unpack("!4sBlhlBB", header)
response_length = header_parsed[3]
return ByteUtil(self.__sock.recv(response_length))
# if not wait_for_response OR invalid response:
return ByteUtil()
评论列表
文章目录