reset a3, kut Charlie ;)
[tt2015.git] / a3 / code / adapter / listener.py
diff --git a/a3/code/adapter/listener.py b/a3/code/adapter/listener.py
new file mode 100644 (file)
index 0000000..f0a7382
--- /dev/null
@@ -0,0 +1,137 @@
+#!/usr/bin/python
+from sender import Sender
+import sys
+import socket
+
+GASTPORT = 1203
+
+if __name__ == "__main__":
+    serverPort = 10000
+    if len(sys.argv) > 1:
+        serverPort = int(sys.argv[1])
+    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+    s.bind(('', GASTPORT))
+    s.listen(1)
+    print 'Listening on port {} for Gast'.format(GASTPORT)
+    conn, addr = s.accept()
+    print 'Connected by Gast at {}'.format(addr)
+    print 'Initiating connection to EchoServer at port {}...'.format(serverPort)
+    sender = Sender(serverIP="127.0.0.1", networkInterface="lo", isLocal=True, serverPort=serverPort, waitTime=1, isVerbose=0)
+    seqnr = 0
+    response = ''
+    data = ''
+    while True:
+        ch = conn.recv(1)
+        if not ch:
+            break
+        
+        if ch != ' ':
+            data = data+ch
+            continue
+        
+        data = conn.recv(int(data))
+        print "INPUT: "+data
+       
+        if data == 'SUT-RESET':
+            print 'resetting the SUT...'
+            sender = Sender(serverIP="127.0.0.1", networkInterface="lo", isLocal=True, serverPort=serverPort, waitTime=1, isVerbose=0)
+            data = ''
+            continue
+        elif data == 'SYN':
+            seqnr = 100
+            print 'S: {}'.format(seqnr)
+            response = sender.sendInput('S', seqnr, seqnr)
+        elif data == 'ACK':
+            response = 'Timeout'
+            if sender.lastSeqReceived != None:
+                seqnr += 1
+                print 'A: {}'.format(seqnr)
+                response = sender.sendInput('A', seqnr, sender.lastSeqReceived + 1)
+        elif data == 'DATA':
+            response = 'Timeout'
+            if sender.lastSeqReceived != None:
+                seqnr += 1
+                print 'DAT: {} sending: a'.format(seqnr)
+                response = sender.sendInput('PA', seqnr, sender.lastSeqReceived + 1, 'a')
+        elif data == 'RST':
+            response = 'Timeout'
+            if sender.lastSeqReceived != None:
+                seqnr += 1
+                print 'RP: {}'.format(seqnr)
+                response = sender.sendInput("RP", seqnr, 0)
+                sender.sendReset()
+        elif data == 'FIN':
+            response = 'Timeout'
+            if sender.lastSeqReceived != None:
+                seqnr += 1
+                print 'F: {}'.format(seqnr)
+                response = sender.sendInput("FA", seqnr, sender.lastSeqReceived + 1)
+        else:
+            print 'INVALID INPUT!'
+            break
+
+        if response == 'Timeout':
+            data = 'TO'
+        elif response[0] == 'A':
+            data = 'ACK'
+        elif response[0] == 'PA':
+            data = 'DATA'
+        elif response[0] == 'R':
+            data = 'RST'
+        elif response[0] == 'SA':
+            data = 'SYN-ACK'
+        else:
+            data = 'ERR'
+        
+        print 'RESPONSE: '+data
+        conn.send('{} {}'.format(len(data), data));        
+        
+        data = ''
+        continue
+         
+        if not data:
+            break
+        data = data.strip()
+        if data == 'Listen?':
+            sender = Sender(serverIP="127.0.0.1", networkInterface="lo", isLocal=True, serverPort=serverPort, waitTime=1, isVerbose=0)
+            response = ''
+        if data == 'SYN?':
+            seqnr = 100
+            print 'S: {}'.format(seqnr)
+            response = sender.sendInput('S', seqnr, seqnr) 
+        if data == 'ACK?':
+            seqnr += 1
+            print 'A: {}'.format(seqnr)
+            response = sender.sendInput('A', seqnr, sender.lastSeqReceived + 1) 
+        if data == 'FINACK?':
+            seqnr += 1
+            print 'FA: {}'.format(seqnr)
+            response = sender.sendInput("FA", seqnr, sender.lastSeqReceived + 1)
+        if data == 'FIN?':
+            seqnr += 1
+            print 'F: {}'.format(seqnr)
+            response = sender.sendInput("F", seqnr, sender.lastSeqReceived + 1)
+        if data == 'RST?':
+            seqnr += 1
+            print 'RP: {}'.format(seqnr)
+            response = sender.sendInput("RP", seqnr, 0)
+            sender.sendReset()
+        if response:
+            if response == 'Timeout':
+                print 'data: {} - TIMEOUT!'.format(data)
+                conn.send('TIMEOUT!\n')
+            elif response[0] == 'A':
+                print 'data: {} - ACK!'.format(data)
+                conn.send('ACK!\n')
+            elif response[0] == 'R':
+                print 'data: {} - RST!'.format(data)
+                conn.send('RST!\n')
+            elif response[0] == 'SA':
+                print 'data: {} - SYNACK!'.format(data)
+                conn.send('SYNACK!\n')
+        else:
+            print 'data: {}'.format(data)
+    print 'closed'
+    conn.close()
+    exit()