1#! /usr/bin/env python
2
3# Test network throughput.
4#
5# Usage:
6# 1) on host_A: throughput -s [port]                    # start a server
7# 2) on host_B: throughput -c  count host_A [port]      # start a client
8#
9# The server will service multiple clients until it is killed.
10#
11# The client performs one transfer of count*BUFSIZE bytes and
12# measures the time it takes (roundtrip!).
13
14
15import sys, time
16from socket import *
17
18MY_PORT = 50000 + 42
19
20BUFSIZE = 1024
21
22
23def main():
24    if len(sys.argv) < 2:
25        usage()
26    if sys.argv[1] == '-s':
27        server()
28    elif sys.argv[1] == '-c':
29        client()
30    else:
31        usage()
32
33
34def usage():
35    sys.stdout = sys.stderr
36    print 'Usage:    (on host_A) throughput -s [port]'
37    print 'and then: (on host_B) throughput -c count host_A [port]'
38    sys.exit(2)
39
40
41def server():
42    if len(sys.argv) > 2:
43        port = eval(sys.argv[2])
44    else:
45        port = MY_PORT
46    s = socket(AF_INET, SOCK_STREAM)
47    s.bind(('', port))
48    s.listen(1)
49    print 'Server ready...'
50    while 1:
51        conn, (host, remoteport) = s.accept()
52        while 1:
53            data = conn.recv(BUFSIZE)
54            if not data:
55                break
56            del data
57        conn.send('OK\n')
58        conn.close()
59        print 'Done with', host, 'port', remoteport
60
61
62def client():
63    if len(sys.argv) < 4:
64        usage()
65    count = int(eval(sys.argv[2]))
66    host = sys.argv[3]
67    if len(sys.argv) > 4:
68        port = eval(sys.argv[4])
69    else:
70        port = MY_PORT
71    testdata = 'x' * (BUFSIZE-1) + '\n'
72    t1 = time.time()
73    s = socket(AF_INET, SOCK_STREAM)
74    t2 = time.time()
75    s.connect((host, port))
76    t3 = time.time()
77    i = 0
78    while i < count:
79        i = i+1
80        s.send(testdata)
81    s.shutdown(1) # Send EOF
82    t4 = time.time()
83    data = s.recv(BUFSIZE)
84    t5 = time.time()
85    print data
86    print 'Raw timers:', t1, t2, t3, t4, t5
87    print 'Intervals:', t2-t1, t3-t2, t4-t3, t5-t4
88    print 'Total:', t5-t1
89    print 'Throughput:', round((BUFSIZE*count*0.001) / (t5-t1), 3),
90    print 'K/sec.'
91
92
93main()
94