Example #1
0
    def establish(self):
        header = Header()
        self.isn = header.isn
        self.seq_num = self.isn
        header.syn = 1
        send_packet(self.sender, header, logger=self.logger)  # 1st handshake

        received_header, received_data, dest_ip, dest_port, received_time = \
                                        receive_packet(self.sender, self.logger)

        if received_header.syn == 1 and received_header.ack == 1:
            print('establishment request acked from {}:{}'.format(
                dest_ip, dest_port))
            header.syn = 0
            header.ack = 1
            self.ack_num = received_header.seq_num + 1
            header.ack_num = self.ack_num
            header.seq_num = received_header.ack_num
            self.seq_num = header.seq_num
            send_packet(self.sender, header,
                        logger=self.logger)  # 3rd handshake

            self.status = 2
            return True
Example #2
0
    def close(self):
        header = Header()
        header.fin = 1
        header.seq_num = self.seq_num
        header.ack_num = self.ack_num
        send_packet(self.sender, header, logger=self.logger)
        print('connection to {}:{} closing'.format(self.dest_ip,
                                                   self.dest_port))
        received_header, received_data, dest_ip, dest_port, received_time = \
                        receive_packet(self.sender, self.logger)

        print(received_header.ack, received_header.ack_num, self.seq_num)
        if received_header.ack == 1 and received_header.ack_num == self.seq_num + 1:
            self.status = 3
            received_header, received_msg, dest_ip, dest_port, received_time = \
                            receive_packet(self.sender, self.logger)
            print('connection to {}:{} closed'.format(dest_ip, dest_port))
            header = Header()
            header.ack = 1
            self.ack_num = received_header.seq_num + 1
            header.ack_num = self.ack_num
            send_packet(self.sender, header, logger=self.logger)
            self.sender.close()
        self.logger.sender_conclude()
Example #3
0
    def receive(self):
        header = Header()
        received_header, received_data, source_ip, source_port, received_time =\
                        receive_packet(self.receiver, logger=self.logger)
        self.receiver.connect((source_ip, source_port))

        if received_header.syn == 1 and received_header.ack == 0:
            # 1st handshake
            print('connection request from {}:{}'.format(
                source_ip, source_port))
            self.isn = header.isn
            header.ack_num = received_header.seq_num + 1
            self.ack_num = received_header.seq_num + 1
            self.seq_num = header.seq_num
            header.ack = 1
            header.syn = 1
            self.status = 1
            send_packet(self.receiver, header,
                        logger=self.logger)  # 2nd handshake

        elif self.status == 1 and received_header.syn == 0 and received_header.ack == 1:
            # 3rd handshake
            self.seq_num = received_header.ack_num
            self.data_bytes = b''
            self.status = 2
            print('connection established with {}:{}'.format(
                source_ip, source_port))

        elif self.status == 2 and received_header.fin == 1:
            # closing
            print('connection to {}:{} closing'.format(source_ip, source_port))
            self.logger.data_size = len(self.data_bytes)

            with open(FILE_RECEIVED, 'wb') as f:
                f.write(self.data_bytes)

            header.ack = 1
            header.ack_num = received_header.seq_num + 1
            self.ack_num = header.ack_num
            header.seq_num = self.seq_num
            send_packet(self.receiver, header, logger=self.logger)

            header = Header()
            header.fin = 1
            header.seq_num = self.seq_num
            header.ack_num = self.ack_num
            send_packet(self.receiver, header, logger=self.logger)
            # received_header, received_data, source_ip, source_port =\
            #             receive_packet(self.receiver)
            print('connection to {}:{} closed'.format(source_ip, source_port))
            self.logger.receiver_conclude()
            return False

        elif self.status == 2:
            print('receiving data from {}:{}'.format(source_ip, source_port))
            if len(received_data) > 0:
                self.logger.num_segments += 1
            if received_header.seq_num in self.buffer or received_header.seq_num < self.ack_num:
                self.logger.dup_count += 1
            if received_header.seq_num == self.ack_num:
                self.ack_num = received_header.seq_num + len(received_data)
                self.data_bytes += received_data
                if len(self.buffer) > 0:
                    next_expected = received_header.seq_num + len(
                        received_data)
                    while next_expected in self.buffer:
                        buffered_next = self.buffer[next_expected]
                        self.data_bytes += buffered_next
                        next_expected += len(buffered_next)
                        self.ack_num += len(buffered_next)

            elif received_header.seq_num > self.ack_num:
                self.buffer[received_header.seq_num] = received_data

            header = Header()
            header.ack = 1
            header.ack_num = self.ack_num
            header.seq_num = self.seq_num
            send_packet(self.receiver, header, logger=self.logger)

        return True
Example #4
0
          def info_check(self):
                    header = Header()
                    #This should be added!
                    received_header, received_data, source_ip, source_port, received_time = receive_packet(self.receiver, logger=self.logger)
                    if not received_header:
                              return True
                    
                    self.receiver.connect((source_ip, source_port))
                    if received_header.syn == 1 and received_header.ack == 0:
                              self.isn = header.isn
                              header.ack_num = received_header.seq_num+1
                              self.ack_num = received_header.seq_num+1
                              self.seq_num = header.seq_num
                              header.ack = 1
                              header.syn = 1
                              self.status = 1
                              send_packet(self.receiver, header, logger=self.logger)
                              #THis          send_packet()



                              #judge_1 = self.status
                              #judge_2 = received_header.syn
                              #judge_3 = received_header.ack
                    
                    elif self.status == 1 and received_header.syn ==2 and received_header.ack == 1:
                              
                              self.seq_num = received_header.ack_num
                              self.data_num = b''
                              self.status = 2

                    
                    elif self.status == 2 and received_header.fin == 1:
                                        
                              self.logger.data_size = len(self.data_num)
                              with open(file_name,'wb') as f:
                                        f.write(self.data_num)
                              header.ack = 1
                              header.ack_num = received_header.seq_num+1
                              self.ack_num = header.ack_num
                              header.seq_num = self.seq_num
                              send_packet(self.receiver, header, logger = self.logger)
                              header = Header()
                              header.fin = 1
                              header.seq_num = self.seq_num
                              header.ack_num = self.ack_num
                              send_packet(self.receiver, header, logger = self.logger)
                              #Function          
                              self.logger.receiver_conclude()
                              return False

                    elif self.status == 2:
                                        
                              if len(received_data) > 0:
                                        self.logger.num_segments = self.logger.num_segments+1
                              if received_header.seq_num in self.memo or received_header.seq_num < self.ack_num:
                                        self.logger.dup_count = self.logger.dup_count + 1
                                        if len(self.memo) > 0:
                                                  check_next = received_header.seq_num+len(received_data)
                                                  while check_next in self.memo:
                                                            buffer_load = self.memo[check_next]
                                                            self.data_num = self.data_num + buffer_load
                                                            check_next = check_next + len(buffer_load)
                                                            self.ack_num = self.ack_num + len(buffer_load)
                              elif received_header.seq_num > self.ack_num:
                                        print('Here is stage 3')        
                                        self.memo[received_header.seq_num] = received_data

                              print('here is the start of the header')
                              header = Header()
                              header.ack = 1
                              header.ack_num = self.ack_num
                              header.seq_num = self.seq_num
                              send_packet(self.receiver, header, logger = self.logger)







                                        

                                                  
                              











                    return True