def sendAck(index, fileName): ack = Header() #populate it with the sequencenum and file name and ACK message type ack.datatype = "ACK" ack.sequencenumber = index ack.options = fileName ackHead = ack.Write() #send just the ACK header clientSocket.sendto(ackHead, serverAddr)
def inputs(): #define global variables global state global putFile #create header to populate request message with while(1): #sys arg input scheme datatype = sys.argv[1] #original input scheme #datatype = raw_input("GET or PUT a file?\n") if (datatype == "GET") or (datatype == "PUT"): break else: print "Please input a proper request (GET or PUT)" while(1): #sysarg input filename = sys.argv[2] #original input method #filename = raw_input("What file do you want/have?\n") if datatype == "PUT": if os.path.isfile(filename): print "Fetching File..." putFile = filename break else: print "File does not exist. Choose another file..." if datatype == "GET": break print"Processing Request..." #create instance of header class request = Header() #populate it with the input and write a header for the request request.datatype = datatype request.options = filename reqHead = request.Write() #update state variable if request.datatype == "GET": state=1 else: state=2 #return the header meant to be sent with the request return state, reqHead
def input(): reqType = raw_input("Get or Put?") fileName = raw_input)"Which File?") #define the header # Create test header testhdr = Header() testhdr.datatype = "PUT" testhdr.filesize = "X" testhdr.numberofpackets = "1" testhdr.sequencenumber = "1" testhdr.packetsize = "100" testhdr.timetolive = "5" testhdr.options = "charlie_test.py" head = testhdr.Write() print repr(head) #open file to read fp = open(testhdr.options, "r") #read the file and store into dict with index putDict = {} index=0 while True: putDict[index] = fp.read(msgSize) if len(putDict[index])<80: print "EOF" break
def filePut(reqHead): #define global variables global state global fileDict global putFile global messageSize global serverAddr global emptyhdr fileDict = {} #send request to server messageSend = reqHead print "header built. Sending PUT request to server..." clientSocket.sendto(messageSend, serverAddr) #wait for ACK regarding request #check and read the socket message=sockReadPut(messageSend) #if message is recieved split message to hader and data to check ACK data, index, filename, messageType = parseMessage(message) #check for ack if messageType == "ACK": #open file and break it up into fileDict print "Server received request. Preparing file for transport..." #read file and populate dictionary with it elif (len(message) == 0): print "Server Timed out. Closing application." return #brians way of doing things--------------------------------- #open file and get relevant data out of it for header print putFile FILE = open(putFile, "rb") fileData = FILE.read() filebytes = len(fileData) filepackets = filebytes/messageSize packetsize = 100 FILE.close() # STOP-AND-WAIT needed here: Send file parts #set up sequence number for sending data seqNumber = 1 #for i (start at 0) to end of file (i increments by message size for i in range(0, filebytes+1, messageSize): print ('Building packet [%d]' % i) #Create data header dataHDR = Header() dataHDR.datatype = "DATA" dataHDR.filesize = str(filebytes) dataHDR.numberofpackets = str(filepackets) dataHDR.packetsize = str(packetsize) dataHDR.timetolive = "5" dataHDR.options = putFile dataHDR.sequencenumber = str(seqNumber) dataheader = dataHDR.Write() #match data types just incase using dataheader doesnt work headerBytes = bytearray(dataheader) # Create the message sequence and join with the header #fileOBJ = open(filepath) #open the file > step fid in the file where i is (0 then 60 then 120....) with open(putFile, "rb") as binary_file: #Seek to specified position binary_file.seek(i) #create message with dataheader and reading msgSize bytes from file messageSend = dataheader + binary_file.read(messageSize) # Send message sequence print ('sending packet [%d]...' % seqNumber) clientSocket.sendto(messageSend, serverAddr) #STOP-AND-WAIT print ('checking for ACK for packet [%d]' % i) serverMessage = sockReadPut(messageSend) #check if it is an ACK - parse message first data, index, filename, messageType = parseMessage(message) #if ack is for correct sequence number increment seq num and start the loop over again if messageType == "ACK": seqNumber = seqNumber + 1 print ('Packet [%d] succesfully sent!' % i) #if not ack for correct sequence number restart loop at current sequence number #if there was a total timeoutleave this loop - check again in the for loop elif len(serverMessage) == 0: break #file closes automatically with with loop type #if there was a total timeout leave the for loop if len(serverMessage) == 0: break #Send EOF (empty data message with dummt header sentEOF = clientSocket.sendto(emptyhdr.Write() + "", serverAddr)