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 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 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 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'] fhash = recv.header.fields['hash']