Select Git revision
UDP-client-server.py
UDP-client-server.py 4.39 KiB
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
global max_delay
min_delay = 100.
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
print (max_delay, min_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()