#!/usr/bin/env python # # TRACCIA DELL'ESERCIZIO # # Realizzare un equivalente del comando PING utilizzando i socket UDP. Il processo client invia un pacchetto al server, aspetta di ricevere il pacchetto di risposta, e stampa a schermo il round trip time. Se il client non riceve una risposta dal server per piu' di un secondo, allora assume che il pacchetto sia andato perso e procede con l'invio del pacchetto successivo. In totale il client deve inviare al server un totale di 10 pacchetti. Il ruolo del server in quest'esercizio e' molto semplice: deve semplicemente reinviare al client il pacchetto ricevuto. NOTA: per simulare la perdita di un pacchetto il server puo' decidere, utilizzando un numero random, di scartare il pacchetto ricevuto senza rispondere al client. # SUGGERIMENTO: ricordatevi della funzione s.settimeout(delay) import random, socket, sys, time s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) MAX = 65535 PORT = 1060 def getTimeMillis(): return time.time()*1000 if 2 <= len(sys.argv) <= 3 and sys.argv[1] == 'server': interface = sys.argv[2] if len(sys.argv) > 2 else '' s.bind((interface, PORT)) print 'Listening at', s.getsockname() while True: data, address = s.recvfrom(MAX) if random.randint(0, 1): print 'The client at', address, 'says:', repr(data) splittedData = data.split() s.sendto('PONG ' + splittedData[1] + ' ' + splittedData[2], address) else: print 'Pretending to drop packet from', address elif len(sys.argv) == 3 and sys.argv[1] == 'client': hostname = sys.argv[2] s.connect((hostname, PORT)) print 'PING '+ hostname + str(s.getpeername()) + '. Sending 10 messages' delay = 1 for seqNum in range(1,11): s.send('PING ' + str(seqNum) + ' ' + '{0:.5f}'.format(getTimeMillis())) s.settimeout(delay) try: data = s.recv(MAX) except socket.timeout: print 'Request timeout for message', seqNum else: splittedData = data.split() timeEnd = getTimeMillis() timeStart = float(splittedData[2]) rtt = timeEnd - timeStart print 'PONG! Round Trip Time: ', rtt else: print >>sys.stderr, 'usage: udp_remote.py server [ ]' print >>sys.stderr, ' or: udp_remote.py client ' sys.exit(2)