Пример #1
0
    def CheckDataReceived(self):

        if len(self.buffer_in) >= 24:

            mstart = self.buffer_in[:24]
            ms = StreamManager.GetStream(mstart)
            reader = BinaryReader(ms)

            try:
                m = Message()
                m.Magic = reader.ReadUInt32()
                m.Command = reader.ReadFixedString(12).decode('utf-8')
                m.Length = reader.ReadUInt32()
                m.Checksum = reader.ReadUInt32()
                self.pm = m
            except Exception as e:
                self.Log('could not read initial bytes %s ' % e)
            finally:
                StreamManager.ReleaseStream(ms)
                del reader

            try:
                #make this threadsafe
                #                reactor.callFromThread(self.CheckMessageData)
                self.CheckMessageData()
            except RecursionError:
                self.Log("Recursion error!!!")
                self.Disconnect()
Пример #2
0
    def DeserializeFromAsyncSocket(socket, cancellation_token):
        buffer = bytearray(24)

        try:
            socket.recv_into(buffer, 24)

            ms = MemoryStream(buffer)
            reader = BinaryReader(ms)

            message = Message()

            message.Magic = reader.ReadUInt32()
            message.Command = reader.ReadFixedString(12).decode('utf-8')

            length = reader.ReadUInt32()

            if length > Message.PayloadMaxSizeInt:
                raise Exception("format too big")

            message.Checksum = reader.ReadUInt32()

            message.Payload = bytearray(length)

            if length > 0:
                message.Payload = Message.FillBufferAsyncStream(
                    socket, length, None)

            checksum = Message.GetChecksum(message.Payload)

            if checksum != message.Checksum:

                print("Message command :%s " % message.Command)
                print("Checksum mismatch: %s " % message.Checksum)
                print("message payload: %s " % message.Payload)

                raise Exception("invalid checksum")

            return message

        except Exception as e:
            print("could not receive buffer from socket: %s " % e)
Пример #3
0
    def CheckDataReceived(self):
        currentLength = len(self.buffer_in)
        if currentLength < 24:
            return

        # Extract the message header from the buffer, and return if not enough
        # buffer to fully deserialize the message object.
        try:
            # Construct message
            mstart = self.buffer_in[:24]
            ms = StreamManager.GetStream(mstart)
            reader = BinaryReader(ms)
            m = Message()

            # Extract message metadata
            m.Magic = reader.ReadUInt32()
            m.Command = reader.ReadFixedString(12).decode('utf-8')
            m.Length = reader.ReadUInt32()
            m.Checksum = reader.ReadUInt32()

            # Return if not enough buffer to fully deserialize object.
            messageExpectedLength = 24 + m.Length
            # percentcomplete = int(100 * (currentLength / messageExpectedLength))
            # self.Log("Receiving %s data: %s percent complete" % (m.Command, percentcomplete))
            if currentLength < messageExpectedLength:
                return

        except Exception as e:
            self.Log('Error: Could not read initial bytes %s ' % e)
            return

        finally:
            StreamManager.ReleaseStream(ms)
            del reader

        # The message header was successfully extracted, and we have enough enough buffer
        # to extract the full payload
        try:
            # Extract message bytes from buffer and truncate buffer
            mdata = self.buffer_in[:messageExpectedLength]
            self.buffer_in = self.buffer_in[messageExpectedLength:]

            # Deserialize message with payload
            stream = StreamManager.GetStream(mdata)
            reader = BinaryReader(stream)
            message = Message()
            message.Deserialize(reader)

            # Propagate new message
            self.MessageReceived(message)

        except Exception as e:
            self.Log('Error: Could not extract message: %s ' % e)
            return

        finally:
            StreamManager.ReleaseStream(stream)

        # Finally, after a message has been fully deserialized and propagated,
        # check if another message can be extracted with the current buffer:
        if len(self.buffer_in) >= 24:
            self.CheckDataReceived()