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
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()
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
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