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()
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()
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
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
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()
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)
def recv(self): self.__verify_client() data = self.client.receive() recv_packet = network.packet(data) self.__receipt_packet(recv_packet) return recv_packet
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']