Exemple #1
0
    def run(self):

        for m in self.file_ctor.missing_blocks():
            p = network.packet()
            p.header = network.packet_header()
            p.header.packet_type = network.packet_header.Request
            p.header.fields['request'] = 'file_block'
            p.header.fields["block_id"] = str(m)
            p.header.fields["hash"] = self.file_ctor.filehash

            self.send(p)

            recv = self.recv()

            if recv.header.packet_type == network.packet_header.FileBlock:
                b_id = int(recv.header.fields['block_id'])
                parent_hash = recv.header.fields['parent_hash']

                if self.file_ctor.filehash == parent_hash:
                    self.file_ctor.put_data(b_id, recv.bytes)
                else:
                    print "Bad Hash !"

        if self.file_ctor.is_completed():
            #todo file hash check
            self.terminate()
        else:
            print self.file_ctor.missing_blocks()
Exemple #2
0
    def run(self):
        #forging packet
        p = network.packet()
        p.header = network.packet_header()
        p.header.packet_type = network.packet_header.Request
        p.header.fields['request'] = 'file_index'

        self.send(p)

        recv_packet = self.recv()

        if recv_packet.header.packet_type == network.packet_header.FileInformation:
            #index info
            bsize = []
            length = int(recv_packet.header.fields['length'])

            for bs in recv_packet.header.fields['blocks'].split(','):
                bsize.append(int(bs))

            name = recv_packet.header.fields['name']
            fhash = recv_packet.header.fields['hash']

            self.index_ctor = file_constructor.file_constructor(name, fhash, length, bsize)

        self.terminate()
Exemple #3
0
 def get_block_packet(self, b_i):
     b = self.__blocks[b_i]
     p = network.packet()
     p.header = network.packet_header()
     p.header.packet_type = network.packet_header.FileBlock
     p.header.length = b.length
     p.header.fields['block_id'] = b.block_id
     p.header.fields['parent_hash'] = self.hash
     p.bytes = b.data
     #print p.to_string()
     return p
Exemple #4
0
    def generate_file_info_packet(self):

        p = network.packet()
        p.header = network.packet_header()
        p.header.packet_type = network.packet_header.FileInformation
        p.header.fields['name'] = self.entry.name
        p.header.fields['hash'] = self.hash
        p.header.fields['length'] = self.length

        b_str = ""
        for b in self.each_blocks_length():
            b_str += "%d," % b
        b_str = b_str.rstrip(',')

        p.header.fields['blocks'] = b_str

        return p
Exemple #5
0
    def run(self):

        for m in self.index_ctor.missing_blocks():
            p = network.packet()
            p.header = network.packet_header()
            p.header.packet_type = network.packet_header.Request
            p.header.fields['request'] = 'index_block'
            p.header.fields['block_id'] = str(m)

            self.send(p)

            recv = self.recv()

            if recv.header.packet_type == network.packet_header.FileBlock:
                b_id = int(recv.header.fields['block_id'])
                self.index_ctor.put_data(b_id, recv.bytes)

        if self.index_ctor.is_completed():
            self.terminate()
        else:
            print self.index_ctor.missing_blocks()
Exemple #6
0
    def handle(self):
        data = self.request[0]
        client = self.request[1]
        print self.server.root_path

        print "Received: %s" % data
        print "From: %s:%d" % (self.client_address[0], self.client_address[1])
        recv_packet = network.packet(data)

        if recv_packet.header.packet_type == network.packet_header.Request:
            req = recv_packet.header.fields['request']
            if req == 'file_index':
                #sending block info
                file_info = self.server.index_blocks.generate_file_info_packet()
                self.send_packet(client, file_info)
            elif req == 'index_block':
                b_id = int(recv_packet.header.fields['block_id'])
                if b_id < self.server.index_blocks.blocks_count():
                    block_packet = self.server.index_blocks.get_block_packet(b_id)
                    self.send_packet(client, block_packet)
            elif req == 'ask_file_info':
                rel_path = recv_packet.header.fields['file']
                fe = self.server.root.get_entry(rel_path)
                if fe is not None:
                    #load this file info memory
                    fi = file_instance.file_instance(fe)
                    self.server.loaded_files.append(fi)
                    info_packet = fi.generate_file_info_packet()
                    self.send_packet(client, info_packet)
            elif req == 'file_block':
                b_id = int(recv_packet.header.fields['block_id'])
                file_hash = recv_packet.header.fields['hash']
                fi = self.server.get_file(file_hash)
                if fi is not None:
                    bp = fi.get_block_packet(b_id)
                    self.send_packet(client, bp)
Exemple #7
0
 def recv(self):
     self.__verify_client()
     data = self.client.receive()
     recv_packet = network.packet(data)
     self.__receipt_packet(recv_packet)
     return recv_packet
Exemple #8
0
    def endpoint(self):
        return self.host, self.port

    def send(self, data):
        self.socket.sendto(data, self.endpoint())


    def receive(self):
        data = self.socket.recv(self.buffer_size)
        return data

if __name__ == '__main__':

    c = client('127.0.0.1')
    p = network.packet()
    p.header = network.packet_header()
    p.header.packet_type = network.packet_header.Request
    p.header.fields['request'] = 'file_index'
    c.send(p.to_chunk())
    recv = c.receive()
    bcount = len(recv.header.fields['blocks'].split(','))
    bsize = []
    length = int(recv.header.fields['length'])

    for bs in recv.header.fields['blocks'].split(','):
        bsize.append(int(bs))

    print bsize

    name = recv.header.fields['name']