def connect(self, connect_handler): #create SYN packet # print ("I AM A CLIENT") self.type = "CLIENT" packet = Packet(None, (self.host.address, self.host.port)) packet.flag = "SYN" self.STATE = __SYN_SENT__ print ("LISTEN <- SYN") #put SYN packet on the link packet.set_key("SYN") self.cache[packet.key] = packet self.sched.add(self.current_time(), packet, self.send_data) #print "sent: " + str(packet.fla) self.connect_handler = connect_handler
def store(self, time, packet): #print ("TYPE:" + self.type, "FLAG:" + str(packet.flag), "STATE: " + self.STATE + "\n") #print ("\n") if packet.body: self.buffer = packet.body print (self.buffer) if self.type == "SERVER": #Client sent out ACK, now server is fully connected if packet.flag == "ACK" and self.STATE == __SYN_RCVD__: print ("ACK-RCVD") print (__SYN_RCVD__, "->", __ESTABLISHED__) self.STATE = __ESTABLISHED__ a = self self.accept_handler(self.current_time(), a) elif packet.flag == "ACK" and self.STATE == __ESTABLISHED__: pack = Packet(None, self.remote) pack.flag = "ACK" self.STATE == __CLOSE_WAIT__ self.cache[pack.key] = pack self.sched.add(self.current_time(), pack, self.send_data) elif packet.flag == "ACK" and self.STATE == __LAST_ACK__: self.STATE == __CLOSED__ print (__LAST_ACK__, "->", __CLOSED__) return elif packet.flag == None and self.STATE == __ESTABLISHED__: #s = raw_input(str(packet.seq_number) + " : " + str(self.packet_number)) if self.packet_number == packet.seq_number: #print (self.packet_number, packet.seq_number, packet.length) #s = raw_input("self.packet_number == packet.seq_number") pack = Packet(None, self.remote) pack.flag = "ACK" #print (packet.seq_number) pack.server_ack = packet.seq_number + packet.length self.packet_number = pack.server_ack self.cache[pack.key] = pack #print ("Packet Number: " + str(self.packet_number)) print ("<- ack " + str(pack.server_ack)) self.sched.add(self.current_time(), self.buffer, self.recv_handler) self.sched.add(self.current_time(), pack, self.send_data) else: #print (self.packet_number, packet.seq_number, packet.length) #s = input("self.packet_number !!!= packet.seq_number") self.cache[packet.seq_number] = packet pack = Packet(None, self.remote) pack.flag = "ACK" #print (packet.seq_number) self.cache[pack.key] = pack pack.server_ack = self.packet_number self.packet_number = pack.server_ack print ("<- ack " + str(pack.server_ack)) self.sched.add(self.current_time(), self.buffer, self.recv_handler) self.sched.add(self.current_time(), pack, self.send_data) elif packet.flag == "FIN" and self.STATE == __ESTABLISHED__: pack1 = Packet(None, self.remote) pack1.flag = "ACK" self.STATE = __CLOSE_WAIT__ print (__ESTABLISHED__, "->", __CLOSE_WAIT__) pack1.set_key("ACK") self.cache[pack1.key] = pack1 self.sched.add(self.current_time(), pack1, self.send_data) pack2 = Packet(None, self.remote) pack2.flag = "FIN" self.STATE = __LAST_ACK__ pack2.set_key("FIN") self.cache[pack2.key] = pack2 print (__CLOSE_WAIT__, "->", __LAST_ACK__) self.sched.add(self.current_time(), pack2, self.send_data) elif packet.flag == "SYN" and self.STATE == __CLOSED__: self.STATE = __SYN_RCVD__ pack = Packet(None, self.remote) pack.flag = "SYNACK" print ("SYN-RCVD -> SYN+ACK") pack.set_key('SYNACK') self.cache[pack.key] = pack self.sched.add(self.current_time(), pack, self.send_data) ''' pass ''' #Must be a client else: if packet.flag == "ACK" and self.STATE == "ESTABLISHED": print ("CLIENT RECVD ", packet.server_ack) #print self.cache[packet.server_ack][1] , self.current_time() if ( packet.server_ack in self.cache.keys() and packet.server_ack != self.cache[packet.server_ack].seq_number + self.cache[packet.server_ack].length ): print (self.cache.keys()) print (packet.server_ack, self.cache[packet.server_ack].seq_number) seq = self.cache[packet.server_ack].seq_number length = self.cache[packet.server_ack].length print ("-> retransmit " + str(seq) + " - " + str(seq + length)) self.cache[packet.server_ack] = (self.cache[packet.server_ack], self.current_time() + self.time_out) self.sched.add(self.current_time(), self.cache[packet.server_ack], self.send_data) #start over cause it missed the first data elif packet.server_ack not in self.cache.keys(): for pack in self.cache: self.cache[pack.key] = pack self.sched.add(self.current_time(), self.cache[pack], self.send_data) else: #print "finishing early?" self.sched.add(self.current_time(),self.buffer, self.recv_handler ) del self.cache[packet.server_ack] if len(self.cache) == 0: print (__ESTABLISHED__, " ->",__FIN_WAIT_1__) pack = Packet(None, self.remote) pack.flag = "FIN" self.STATE = __FIN_WAIT_1__ self.cache[pack.key] = pack self.sched.add(self.current_time(), pack, self.send_data) #Client recieved SYNACK from server, now client is fully connected elif packet.flag == "ACK" and self.STATE == "FIN_WAIT_1": print (__FIN_WAIT_1__, " ->", __FIN_WAIT_2__) self.STATE = __FIN_WAIT_2__ pack = Packet(None, self.remote) pack.set_key("ACK") pack.flag = "ACK" self.cache[pack.key] = pack self.sched.add(self.current_time(), pack, self.send_data) elif packet.flag =="SYNACK" and self.STATE == "SYN_SENT": self.STATE = __ESTABLISHED__ pack = Packet(None, self.remote) pack.flag = "ACK" print ("SYN+ACK-RCVD <- ACK") print (__SYN_SENT__, "->", __ESTABLISHED__) #print ("CLIENT CONNECTED...") self.STATE = __ESTABLISHED__ pack.set_key("ACK") self.cache[pack.key] = pack self.sched.add(self.current_time(), pack, self.send_data) self.connect_handler() elif packet.flag == "FIN" and self.STATE == __FIN_WAIT_2__: pack = Packet("FINISHED", self.remote) pack.flag = "ACK" pack.set_key("ACK") self.cache[pack.key] = pack self.STATE = __TIME_WAIT__ self.sched.add(self.current_time(), pack, self.send_data) self.sched.add(self.current_time(), (0, pack), self.time_wait) '''