def __closePassive(self, ackPacket): if self.srcRxPPort is None: self.socket.close() raise RxPException("Socket not bound") if self.state != 'ESTABLISHED': self.socket.close() raise Exception("Connection not established") fin_flags = (False, False, False, True, False, False) finPacket = RxPacket( srcPort = self.srcRxPPort, desPort = self.desRxPPort, seqNum = self.seqNum, ackNum = self.ackNum, flagList = fin_flags, winSize = self.recvWindowSize, ) self.seqNum += 1 if self.seqNum > RxPacket.maxSeqNum(): self.seqNum = 0 resetsLeft = self.resetLimit isFinAcked = False while resetsLeft and (not isFinAcked): self.sendto(finPacket.toByteArray(), (self.desAddr, self.desUDPPort)) try: data, address = self.recvfrom(self.recvWindowSize) packet = self.__reconstructPacket(data) if not packet: resetsLeft -= 1 except socket.timeout: resetsLeft -= 1 continue except Exception: resetsLeft -= 1 continue else: if (packet.isAck() and packet.header['ackNum'] == self.seqNum): isFinAcked = True if (packet.isFin()): ack_flags = (False, False, False, True, False, False) finPacket = RxPacket( srcPort = self.srcRxPPort, desPort = self.desRxPPort, seqNum = self.seqNum, ackNum = self.ackNum, flagList = fin_flags, winSize = self.recvWindowSize, ) self.sendto(finPacket.toByteArray(), (self.desAddr, self.desUDPPort)) self.socket.close() self = RxPSocket(self.srcRxPPort, self.debug) self.state = 'CLOSED'
def __sendCnct(self): #create packet self.log("Creating init packet......\n") try: self.log("Setting flags...\n") flags = (True, False, False, False, False, False) except Exception as e: self.log("Exception: " + str(e)) sys.exit(0) self.log("Flags created...\n") try: cnctPacket = RxPacket.getCnct( srcPort = self.srcRxPPort, desPort = self.desRxPPort, seqNum = self.seqNum, ackNum = self.ackNum, winSize = self.recvWindowSize, ) except Exception as e: self.log("Exception: " + str(e)) sys.exit(0) #increment seq num self.log("Incrementing sequence number......\n") self.seqNum = self.seqNum + 1 #increment by number of bytes (20 byte header only) if self.seqNum > RxPacket.maxSeqNum(): self.seqNum = 0 #transfer packet resetsLeft = self.resetLimit self.log("Entering send loop for CNCT packet......\n") while resetsLeft: self.log("Sending init to IP: " + self.desAddr + " and Port:" + str(self.desUDPPort) +"...\n") try: self.sendto(cnctPacket.toByteArray(), (self.desAddr, self.desUDPPort)) except Exception as e: self.log("Exception while calling sendto: " + str(e) + "\n") self.log("SENT INIT PACKET!\n") try: self.log("Waiting for ack......\n") data, address = self.recvfrom(self.recvWindowSize) log("Packet received successfully, calling reconstructPacket from _sendCNCT...\n") packet = self.__reconstructPacket(data = bytearray(data)) log("Packet successfully reconstructed inside _sendCNCT...\n") if not packet: self.log("Checksum failed......\n") resetsLeft -= 1 continue except socket.timeout: resetsLeft -= 1 except Exception: resetsLeft -= 1 else: if packet.isAck() and packet.header['ackNum'] == self.seqNum: self.log("init has been acked......\n") break else: self.log("Wrong packet recieved, restarting cnct loop......\n") resetsLeft -= 1 if not resetsLeft: self.log("socket timeout......\n") raise Exception('socket timeout') return packet
def send(self, msg): superlog("We're sending: " + str(len(msg)) + " bytes.\n") if self.srcRxPPort is None: raise Exception("Socket not bound") if self.state != 'ESTABLISHED': raise Exception("Connection not established") dataQueue = deque() packetQueue = deque() sentQueue = deque() lastSeqNum = self.seqNum log("Fragmenting data, adding it to que...\n") #fragment data and add it to data queue for i in range(0, len(msg), RxPacket.getDataLength()): if (i + RxPacket.getDataLength() > len(msg)): dataQueue.append(bytearray(msg[i : ])) log("In send dataQue loop, adding: " + bytearray(msg[i : ]).decode('UTF-8') ) else: dataQueue.append(bytearray(msg[i : i + RxPacket.getDataLength()])) log("In send dataQue loop, adding: " + bytearray(msg[i : i + RxPacket.getDataLength()]).decode('UTF-8')) log("Constructing to data queue...\n") #construct packet queue from data queue #numPackQd = 0 for data in dataQueue: if data == dataQueue[0]: flags = (False, False, False, False, True, False) if data == dataQueue[-1]: flags = (False, False, False, False, False, True) else: flags = (False, False, False, False, False, False) packet = RxPacket( srcPort = self.srcRxPPort, desPort = self.desRxPPort, seqNum = self.seqNum, ackNum = self.ackNum, flagList = flags, winSize = self.recvWindowSize, data = data ) self.seqNum += 1 if self.seqNum >= RxPacket.maxSeqNum(): self.seqNum = 0 if packet.isAck(): sys.exit(0) packetQueue.append(packet) #numPackQd += 1 #print numPackQd log("Packet queue created...\n") log("Preparing to send packets...\n") numPackSent = 0 resetsLeft = self.resetLimit while packetQueue and resetsLeft: #send packets in send window window = self.sendWindowSize while window and packetQueue: packetToSend = packetQueue.popleft() if (packetToSend and not isinstance(packetToSend, int)) and (not packetToSend.isAck()): #log("Sending RxPPacket to IP: " + str(self.desAddr) + " and port + " + str(self.desUDPPort) + "...\n") self.sendto(packetToSend.toByteArray(), (self.desAddr, self.desUDPPort)) numPackSent+=1 #log("RxPPacket sent!\n") #log("RXP PACKET SIZE: " + str(len(packet.toByteArray()))) lastSeqNum = packetToSend.header['seqNum'] window -= 1 sentQueue.append(packet) else: continue try: data, address = self.recvfrom(self.recvWindowSize) handShakeFinishedCheck = self.__reconstructPacket(bytearray(data)) packet = self.__reconstructPacket(data = bytearray(data), checkAckNum = lastSeqNum) if not packet: sentQueue.reverse() packetQueue.extendleft(sentQueue) sentQueue.clear() resetsLeft -= 1 continue except socket.timeout: window = 1 resetsLeft -= 1 sentQueue.reverse() packetQueue.extendleft(sentQueue) sentQueue.clear() except Exception: window = 1 resetsLeft -= 1 sentQueue.reverse() packetQueue.extendleft(sentQueue) sentQueue.clear() else: window += 1 if (isinstance(packet, int)): while packet < 0 and sentQueue: packetQueue.appendleft(sentQueue.pop()) packet += 1 continue elif handShakeFinishedCheck.isAck() and handShakeFinishedCheck.header['ackNum'] == self.finalCnctAckNum: flags = (False, False, True, False, False, False) ackPacket = RxPacket( srcPort = self.srcRxPPort, desPort = self.desRxPPort, seqNum = self.seqNum, ackNum = self.ackNum, flagList = flags, winSize = self.recvWindowSize, ) self.sendto(ackPacket.toByteArray(), (self.desAddr, self.desUDPPort)) resetsLeft = self.resetLimit sentQueue.reverse() packetQueue.extendleft(sentQueue) sentQueue.clear() elif packet.isAck(): self.seqNum = packet.header['ackNum'] resetsLeft = self.resetLimit sentQueue.clear() if not resetsLeft: raise Exception('socket timeout')