From e856099109958e53912c08f9c25fb5cabe3f54cd Mon Sep 17 00:00:00 2001
From: "pierre.johner" <pierre.johner@etu.hesge.ch>
Date: Sun, 22 Jan 2017 14:35:31 +0100
Subject: [PATCH] Upload new file

---
 client.py | 170 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 170 insertions(+)
 create mode 100644 client.py

diff --git a/client.py b/client.py
new file mode 100644
index 0000000..90c6487
--- /dev/null
+++ b/client.py
@@ -0,0 +1,170 @@
+#Author Rochat Johner Ares
+
+import file_class
+import packet_class
+import simu_perte_class
+import struct
+from socket import *
+import md5
+import sys
+
+#Check if the arg are valide  
+def controle(argv):
+    flag = True
+    if not (argv[1] == "put" or argv[1] == "get"):
+        print("Mode Invalide")
+        flag = False
+        
+    if not argv[3].isdigit():
+        print("Numero Port Invalide")
+        flag = False
+
+    if not argv[5].isdigit():
+        print("Taux de Perte Invalide")
+        flag = False
+        
+    return flag
+
+#State Machine
+class Statemachine:
+    def __init__(self, canal, filename, action):
+        self.canal = canal
+        self.action = action
+        self.currentstate = 0
+        self.timeOut = 0
+        self.counter = 1
+        self.file = file_class.File(filename)
+        
+        print("Start Client")
+        state = {
+    	    0 : self.state0,
+    	    1 : self.state1,
+    	    2 : self.state2,
+    	    3 : self.state3,
+    	    4 : self.state4,
+    	}
+    	
+    	#Choose the state
+        while True:
+            if self.currentstate != 5:
+                state[self.currentstate]()
+            else:
+                break
+    #Generate the first packet (RRD OR WRQ)        
+    def state0(self):
+        print("Start state 0")
+
+        next = 0
+        if self.action == 'get':
+            next = 1
+            self.file.RRQ()
+        else:
+            next = 2
+            self.file.WRQ()
+   
+        packet = self.file.getPacket()
+        packet.send(self.canal)
+        self.currentstate = next
+        print("End state 0")
+    
+    #State RRD
+    def state1(self):
+        print("Start state 1")
+        try :
+            d = self.file.getPacket().receive(self.canal);
+            self.timeOut = 0
+            d = struct.unpack(">hh"+str(len(d)-4)+"s", d);
+            if d[0] == 5:
+                self.currentstate = 3
+            else:
+                self.file.ACK(d[1])
+                packet = self.file.getPacket()
+                packet.send(self.canal)
+                if d[1] == self.counter:
+                    self.file.receivePacket(d[2])
+                    self.counter += 1
+                if len(d[2]) < 512:
+                    self.currentstate = 5
+                    m = md5.new()
+                    m.update(self.file.data)
+                    result = m.hexdigest()
+                    print(result)
+                  
+        except timeout:
+            packet = self.file.getPacket()
+            packet.send(self.canal)
+            self.timeOut += 1
+            print("timeOut")
+        if self.timeOut > 4 :
+            self.timeOut = 0
+            self.currentstate = 3
+        print("End state 1")
+    
+    #State WRQ    
+    def state2(self):
+        print("Start state 2")
+        try :
+            d = self.file.getPacket().receive(self.canal);
+            self.timeOut = 0
+            d = struct.unpack(">hh", d);
+            self.file.data.seek((d[1])*512)
+            x = self.file.data.read(512)
+            self.file.Data(d[1]+1, x)
+            packet = self.file.getPacket()
+            packet.send(self.canal)
+            if len(x) < 512:
+                self.currentstate = 4
+        except timeout:
+            packet = self.file.getPacket()
+            packet.send(self.canal)
+            self.timeOut += 1
+            print("timeOut")
+        if self.timeOut > 4 :
+            self.timeOut = 0
+            self.currentstate = 3
+        print("End state 2")
+    
+    #Error
+    def state3(self):
+        print("Start state 3")
+        print("Error TimeOut or FileNotFound")
+        self.currentstate = 5
+        print("End state 3")
+    #Last data for send request
+    def state4(self):
+        print("Start state 4")
+        try :
+            d = self.file.getPacket().receive(self.canal);
+            self.timeOut = 0
+            self.currentstate = 5
+        except timeout:
+            packet = self.file.getPacket()
+            packet.send(self.canal)
+            self.timeOut += 1
+            print("timeOut")
+        if self.timeOut > 4 :
+            self.timeOut = 0
+            self.currentstate = 3     
+        print("End state 4")
+    def state5(self):
+        print("Start state 5")
+        print("End state 5")
+
+# Entry of Progm
+if len(sys.argv) != 6:
+    print("Mauvais Nombre Argument : mytftpc <put/get> <nom_DNS_du_serveur> <numero_de_port> <nom_fichier> <taux_de_perte>")
+else:
+    if controle(sys.argv):
+    
+        socket = socket(AF_INET, SOCK_DGRAM)
+        #Bind to all address
+        socket.bind(("0.0.0.0", 50000))
+        socket.settimeout(5.0)
+
+        print "Connection on {}".format(sys.argv[3])
+        
+        canal = simu_perte_class.Canal(sys.argv[5],socket,sys.argv[2],sys.argv[3])
+
+        stateMachine = Statemachine(canal,sys.argv[4],sys.argv[1])
+
+        socket.close()
-- 
GitLab