Skip to content
Snippets Groups Projects
Select Git revision
  • 32b5aceefc5524bd7d2a751fa3587023b5e5030e
  • master default protected
  • experimental
  • itm_trace
4 results

bare0.rs

Blame
  • 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()