コード例 #1
0
      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)
コード例 #2
0
ファイル: Sender.py プロジェクト: geniousisme/Pyle-Transfer
    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)
コード例 #3
0
ファイル: Sender.py プロジェクト: geniousisme/Pyle-Transfer
class Sender(object):
    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)

    def retransmit_counter(self):
        self.retrans_count += 1

    def segment_counter(self):
        self.segment_count += 1

    def read_file_buffer(self, start_bytes):
        self.logger.debug("read file from %s byte" % start_bytes)
        self.sent_file.seek(start_bytes)
        data_bytes = self.sent_file.read(RECV_BUFFER)
        self.logger.debug("data_len: %s bytes" % len(data_bytes))
        return data_bytes

    def print_transfer_stats(self):
        print "====== Transfering Stats ======="
        print "Total bytes sent:", self.file_size
        print "Segments sent =", self.segment_count
        print "Segments Retranmitted =", self.retrans_count

    def send_file_response(self, *pkt_params):
        self.segment_counter()
        packet = self.pkt_gen.generate_packet(*pkt_params)
        self.logger.debug("checksum: %s" % calculate_checksum(*pkt_params))
        self.sender_sock.sendto(packet, self.recv_addr)

    def send_initial_file_response(self):
        for i in xrange(self.window_size):
            seq_num = i * RECV_BUFFER
            ack_num = seq_num + self.window_size * RECV_BUFFER
            if i == 0:
                self.oldest_unacked_pkt.ack_num = ack_num
                self.oldest_unacked_pkt.begin_time = time.time()
            data_bytes = self.read_file_buffer(seq_num)
            fin_flag = len(data_bytes) == 0
            # if fin_flag:
            #    # means we already send all of data at initial stage,
            #    # dont need to tranfer the rest of packet.
            #    break
            self.send_file_response(seq_num, ack_num, fin_flag, data_bytes)
        self.send_time = time.time()

    def retransmit_file_response(self):
        self.logger.debug("retransmit!!!")
        self.logger.debug                                                    \
        ("oldest_unacked_pkt: %s" % self.oldest_unacked_pkt.ack_num)
        initial_seq =                                                        \
          self.oldest_unacked_pkt.ack_num - self.window_size * RECV_BUFFER
        for i in xrange(self.window_size):
            self.retransmit_counter()
            seq_num = initial_seq + i * RECV_BUFFER
            self.logger.debug("retransmit_seq_num: %s" % seq_num)
            ack_num = seq_num + self.window_size * RECV_BUFFER
            self.logger.debug("retransmit_ack_num: %s" % ack_num)
            if i == 0:
                self.oldest_unacked_pkt.ack_num = ack_num
                self.oldest_unacked_pkt.begin_time = time.time()
            data_bytes = self.read_file_buffer(seq_num)
            fin_flag = len(data_bytes) == 0
            self.send_file_response(seq_num, ack_num, fin_flag, data_bytes)
        self.send_time = time.time()

    def is_oldest_unacked_pkt_timeout(self):
        if self.oldest_unacked_pkt.begin_time is None:
            return False
        return time.time() - self.oldest_unacked_pkt.begin_time >= TIME_OUT

    def sender_loop(self):
        self.start_sender()
        is_receiver_found = False
        estimated_rtt = 0
        print "start Pyle Transfer Sender on %s with port %s ..."          \
                                      % self.send_addr
        while self.status:
            try:
                if self.is_oldest_unacked_pkt_timeout():
                    self.logger.debug("timeout!")
                    self.retransmit_file_response()
                read_sockets, write_sockets, error_sockets =               \
                            select.select(self.connections, [], [], 1)
                if read_sockets:
                    recv_packet, recv_addr = self.sender_sock.recvfrom     \
                                                              (RECV_BUFFER)
                    if recv_packet == "I need a sender~":
                        self.sender_sock.sendto                            \
                            ("start file tranfer:%s:%s" %                  \
                            (self.window_size, self.file_size),            \
                             recv_addr)
                        self.send_time = time.time()

                    elif recv_packet == "Come on!":
                        estimated_rtt = time.time() - self.send_time
                        is_receiver_found = True
                        self.send_initial_file_response()

                    elif is_receiver_found:
                        header_params = self.pkt_ext                       \
                                            .get_header_params_from_packet \
                                                              (recv_packet)
                        recv_seq_num  = self.pkt_ext                       \
                                            .get_seq_num(header_params)
                        recv_ack_num  = self.pkt_ext                       \
                                            .get_ack_num(header_params)
                        recv_fin_flag = self.pkt_ext                       \
                                            .get_fin_flag(header_params)
                        log = str(datetime.datetime.now()) + " " +         \
                              str(self.recv_addr[1]) + " " +               \
                              str(self.send_addr[1]) + " " +               \
                              str(recv_seq_num) + " " +                    \
                              str(recv_ack_num)
                        if recv_fin_flag:
                            log += " ACK FIN"
                            sample_rtt = time.time() - self.send_time
                            estimated_rtt = estimated_rtt * 0.875 + sample_rtt * 0.125
                            log += " " + str(estimated_rtt) + "\n"
                            self.log_file.write(log)
                            print "Delivery completed successfully"
                            self.print_transfer_stats()
                            self.close_sender()
                        else:
                            log += " ACK"
                            if self.oldest_unacked_pkt.ack_num == recv_seq_num:
                                sample_rtt = time.time() - self.send_time
                                estimated_rtt = estimated_rtt * 0.875 + sample_rtt * 0.125
                                log += " " + str(estimated_rtt) + "\n"
                                self.log_file.write(log)
                                seq_num = recv_ack_num
                                ack_num  = recv_seq_num                    \
                                           + RECV_BUFFER * self.window_size
                                fin_flag = ack_num >= self.file_size
                                data_bytes = self.read_file_buffer(seq_num)
                                self.send_file_response                    \
                                    (seq_num, ack_num, fin_flag, data_bytes)
                                self.oldest_unacked_pkt.ack_num += RECV_BUFFER
                                self.oldest_unacked_pkt.begin_time = time.time(
                                )
                            else:
                                sample_rtt = time.time() - self.send_time
                                estimated_rtt = estimated_rtt * 0.875 + sample_rtt * 0.125
                                log += " " + str(estimated_rtt) + "\n"
                                self.log_file.write(log)
                                self.logger.debug(
                                    "expected_ack not correct !!!")
                                self.logger.debug(
                                    "oldest_unacked_pkt.num: %s" %
                                    self.oldest_unacked_pkt.ack_num)
                                self.logger.debug("recv_seq_num: %s, ignore" %
                                                  recv_seq_num)
                            # else, ignore the packet

            except KeyboardInterrupt, SystemExit:
                print "\nLeaving Pyle Transfer..."
                self.close_sender()

        self.sender_sock.close()
コード例 #4
0
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()