def __init__(self, recv_ip=localhost, recv_port=default_port+2, \ send_ip=localhost, send_port=default_port, \ filename="test/received_test.pdf", \ log_name="log/recv_log.txt"): self.recv_sock = init_recv_socket((recv_ip, recv_port)) self.connections = [self.recv_sock] self.recv_ip = recv_ip self.recv_port = recv_port self.window_size = 1 self.file_size = 0 self.send_addr = (send_ip, int(send_port)) self.file_write = open(filename, "wb+") self.log_file = [sys.stdout, open(log_name, "w")] \ [log_name != "stdout"] self.pkt_gen = PacketGenerator(recv_port, send_port) self.pkt_ext = PacketExtractor(recv_port, send_port) self.expected_ack = 0 self.logger = logging.getLogger("Receiver") self.logger.setLevel(logging.INFO) hd = logging.StreamHandler() formatter = logging. \ Formatter \ ("%(asctime)s - %(name)s - %(levelname)s - %(message)s") hd.setFormatter(formatter) self.logger.addHandler(hd)
def __init__(self, send_ip=localhost, send_port=default_port, \ recv_ip=localhost, recv_port=default_port+2, \ filename="test/test.pdf", \ log_name="send_log.txt", window_size=1): self.send_addr = (send_ip, send_port) self.sender_sock = init_send_socket((send_ip, send_port)) self.connections = [self.sender_sock] self.recv_addr = (recv_ip, recv_port) self.sent_file = open(filename, "rb") self.log_file = [sys.stdout, open(log_name, "w")] \ [log_name != "stdout"] self.file_size = os.path.getsize(filename) self.window_size = window_size self.status = None self.pkt_gen = PacketGenerator(send_port, recv_port) self.pkt_ext = PacketExtractor(send_port, recv_port) self.segment_count = 0 self.retrans_count = 0 self.send_time = 0 self.oldest_unacked_pkt = UnackedPacket() # logging module init self.logger = logging.getLogger("Sender") self.logger.setLevel(logging.INFO) hd = logging.StreamHandler() formatter = logging. \ Formatter \ ("%(asctime)s - %(name)s - %(levelname)s - %(message)s") hd.setFormatter(formatter) self.logger.addHandler(hd)
class Receiver(object): def __init__(self, recv_ip=localhost, recv_port=default_port+2, \ send_ip=localhost, send_port=default_port, \ filename="test/received_test.pdf", \ log_name="log/recv_log.txt"): self.recv_sock = init_recv_socket((recv_ip, recv_port)) self.connections = [self.recv_sock] self.recv_ip = recv_ip self.recv_port = recv_port self.window_size = 1 self.file_size = 0 self.send_addr = (send_ip, int(send_port)) self.file_write = open(filename, "wb+") self.log_file = [sys.stdout, open(log_name, "w")] \ [log_name != "stdout"] self.pkt_gen = PacketGenerator(recv_port, send_port) self.pkt_ext = PacketExtractor(recv_port, send_port) self.expected_ack = 0 self.logger = logging.getLogger("Receiver") self.logger.setLevel(logging.INFO) hd = logging.StreamHandler() formatter = logging. \ Formatter \ ("%(asctime)s - %(name)s - %(levelname)s - %(message)s") hd.setFormatter(formatter) self.logger.addHandler(hd) def send_open_request(self): self.logger.debug("send open request") self.recv_sock.sendto("I need a sender~", self.send_addr) def send_close_request(self, seq_num, ack_num, fin_flag): self.logger.info("Sending Close Request...") packet = self.pkt_gen.generate_packet(seq_num, ack_num, fin_flag) self.recv_sock.sendto(packet, self.send_addr) def write_file_buffer(self, start_bytes, data_bytes): self.logger.debug("write file from %s byte" % start_bytes) self.logger.debug("data_len: %s" % len(data_bytes)) self.file_write.seek(start_bytes) self.file_write.write(data_bytes) def is_write_file_completed(self): return os.path.getsize(self.file_write.name) == self.file_size def receiver_loop(self): self.start_receiver() print "start Pyle Transfer Reciever on %s with port %s ..." \ % (self.recv_ip, self.recv_port) is_sender_found = False while self.status: try: if not is_sender_found: self.send_open_request() read_sockets, write_sockets, error_sockets = \ select.select(self.connections, [], [], 1) if read_sockets: send_packet, send_addr = self.recv_sock.recvfrom \ (RECV_BUFFER + HEADER_LENGTH) if "start file tranfer" in send_packet: msg, self.window_size, self.file_size = \ send_packet.split(':') self.window_size = int(self.window_size) is_sender_found = True self.file_size = int(self.file_size) self.logger.debug("window_size: %s" % self.window_size) self.logger.debug("file_size: %s" % self.file_size) self.send_addr = send_addr self.recv_sock.sendto("Come on!", self.send_addr) else: header_params = self.pkt_ext \ .get_header_params_from_packet \ (send_packet) send_seq_num = self.pkt_ext \ .get_seq_num(header_params) send_ack_num = self.pkt_ext \ .get_ack_num(header_params) send_fin_flag = self.pkt_ext \ .get_fin_flag(header_params) send_checksum = self.pkt_ext.get_checksum(header_params) log = str(datetime.datetime.now()) + " " + \ str(self.send_addr[1]) + " " + \ str(self.recv_port) + " " + \ str(send_seq_num) + " " + \ str(send_ack_num) if send_fin_flag and self.is_write_file_completed(): self.log_file.write(log + " FIN\n") send_data = self.pkt_ext \ .get_data_from_packet \ (send_packet) self.write_file_buffer(send_seq_num, send_data) self.send_close_request \ (send_seq_num, send_ack_num, send_fin_flag) self.close_receiver() print "Delivery completed successfully" else: self.log_file.write(log + "\n") if self.expected_ack == send_seq_num and \ self.pkt_ext.is_checksum_valid(send_packet): send_data = self.pkt_ext \ .get_data_from_packet \ (send_packet) self.write_file_buffer \ (send_seq_num, send_data) progress_bar(os.path.getsize(self.file_write.name), self.file_size) seq_num = send_ack_num ack_num = send_seq_num \ + RECV_BUFFER * self.window_size self.logger.debug("seq_num: %s" % seq_num) self.logger.debug("ack_num: %s" % ack_num) fin_flag = 0 packet = self.pkt_gen \ .generate_packet \ (seq_num, ack_num, fin_flag) self.recv_sock.sendto(packet, self.send_addr) self.expected_ack += RECV_BUFFER else: self.logger.debug("expected_ack not correct or packet corrupted") self.logger.debug("expected_ack: %s" % self.expected_ack) self.logger.debug("send_seq_num: %s, ignore" % send_seq_num) except KeyboardInterrupt, SystemExit: print "\nLeaving Pyle-Transfer Receiver..." self.close_receiver() os.remove(self.file_write.name) self.recv_sock.close()