diff --git a/UDP-client-server.py b/UDP-client-server.py new file mode 100644 index 0000000000000000000000000000000000000000..9129b47a46402fda2be26f13465995dbf211f7f0 --- /dev/null +++ b/UDP-client-server.py @@ -0,0 +1,118 @@ +import socket +import time +import sys +from threading import Thread + +#DEFINE INPUTS HERE +#CLIENT - SENDER +UDP_DEST_IP='::1' #IP ADDRESS TO SEND DATAGRAMS TO (v4 or v6) +UDP_DEST_PORT=15005 #IP PORT TO SEND DATAGRAMS TO +PACKET_SIZE = 200 #DATAGRAM SIZE IN BYTES +NR_OF_PACKETS=10 #TOTAL NR. OF PACKETS TO SEND +PACKETS_PER_SEC=100 #PACKETS PER SECOND + +#CLIENT - RECEIVER +UDP_RECEIVE_IP = '::1' #IP ADDRESS TO LISTEN FOR INCOMMING PACKETS (v4 or v6) +UDP_RECEIVE_PORT=55555 #IP PORT TO LISTEN FOR INCOMMING PACKETS +BUFFER = 4096 + +#CLIENT-RECEIVER PART +def udp_client_receive(UDP_RECEIVE_IP, UDP_RECEIVE_PORT): + ADDR = (UDP_RECEIVE_IP, UDP_RECEIVE_PORT) + +#MAKE A DUMB IP VERSION CHECK + if ':' in UDP_RECEIVE_IP: + rcv_sock = socket.socket( socket.AF_INET6, socket.SOCK_DGRAM ) + else: + rcv_sock = socket.socket( socket.AF_INET, socket.SOCK_DGRAM ) + + global packet_count_rcvd + global cumulative_delay + global min_delay = 100. + global max_delay = 0. + packet_count_rcvd = 0 + cumulative_delay=0. + + try: + rcv_sock.bind(ADDR) + print 'Server Listening on', ADDR + except Exception: + print '***ERROR: Server Port Binding Failed' + +#FIRE UP THE LISTENER ENGINES + while True: + data, addr = rcv_sock.recvfrom( BUFFER ) + splitdata = data.split(',') + timecount = splitdata[0].strip("('") + rt_delay = (time.time() - float(timecount)) + packet_number = str(splitdata[1].strip("' '")) + packet_number = packet_number.lstrip('0') +#WRITE TO FILE AND DO PACKET COUNT + outfile = open("udp_twoway_results.csv", "a").write(str(time.ctime()+','+'received , '+ packet_number+' , '+str(rt_delay)+'\n')) + print (time.ctime()+','+'received , '+ packet_number+' , '+str(rt_delay)) +# Store minimum and maximum delay + if rt_delay > max_delay: + max_delay = rt_delay + if rt_delay < min_delay: + min_delay = rt_delay + + packet_count_rcvd=packet_count_rcvd+1 + cumulative_delay=cumulative_delay+rt_delay + +#CLIENT SERVER SIDE +def udp_client_send(UDP_DEST_IP, UDP_DEST_PORT, PACKET_SIZE, NR_OF_PACKETS, PACKETS_PER_SEC): + + inter_departure_time = 1./PACKETS_PER_SEC + packet_count_snd=0 + + print "UDP Client Started" + print "UDP target IP:", UDP_DEST_IP + print "UDP target port:", UDP_DEST_PORT + print "UDP Packets to Send:", NR_OF_PACKETS + +#IF IPv6 + if ':' in UDP_DEST_IP: + if PACKET_SIZE > 97: #BUILD DATAGRAM OF DESIRED SIZE + padding='' + for j in range (98, PACKET_SIZE): + padding = padding+str(1) + for i in range (1,NR_OF_PACKETS+1): #SEND SPECIFIED NUMBER OF PACKETS + time.sleep(inter_departure_time ) + snd_sock6 = socket.socket( socket.AF_INET6,socket.SOCK_DGRAM ) + snd_sock6.sendto(str(("%.5f" % time.time(),str('%08d' % i), padding)), (UDP_DEST_IP, UDP_DEST_PORT) ) + packet_count_snd = packet_count_snd+1 + +#IF NOT IPv6 + else: + if PACKET_SIZE > 77: + padding='' + for j in range (78, PACKET_SIZE): + padding = padding+str(1) + for i in range (1,NR_OF_PACKETS+1): + time.sleep(inter_departure_time) + snd_sock = socket.socket( socket.AF_INET,socket.SOCK_DGRAM ) + snd_sock.sendto(str(("%.5f" % time.time(),str('%08d' % i), padding)), (UDP_DEST_IP, UDP_DEST_PORT) ) + packet_count_snd = packet_count_snd+1 + +#WAIT 5SEC FOR ALL PACKETS TO ARRIVE + time.sleep(5) + # Perhaps create a custom object where we store the statistics? + # Or from here save it directly into the database? + PLR = 100 - ((packet_count_rcvd*100.)/packet_count_snd) + + print '\n', packet_count_snd, 'packets sent' + print packet_count_rcvd, 'packets received' + print 'packet loss ratio = ', round(PLR, 3), '%' + + if packet_count_rcvd == 0: + pass + else: + print 'average rtt = ', cumulative_delay/packet_count_rcvd + +#START THE THREADS FOR SENDER AND RECEIVER +if __name__ == "__main__": + receiver_thread = Thread(target=udp_client_receive, args=(UDP_RECEIVE_IP, UDP_RECEIVE_PORT)) + receiver_thread.daemon=True + receiver_thread.start() + time.sleep(1) + sender_thread = Thread(target=udp_client_send, args=(UDP_DEST_IP, UDP_DEST_PORT, PACKET_SIZE, NR_OF_PACKETS, PACKETS_PER_SEC)).start()