| #! /usr/bin/env python | |
| # Test network throughput. | |
| # | |
| # Usage: | |
| # 1) on host_A: throughput -s [port] # start a server | |
| # 2) on host_B: throughput -c count host_A [port] # start a client | |
| # | |
| # The server will service multiple clients until it is killed. | |
| # | |
| # The client performs one transfer of count*BUFSIZE bytes and | |
| # measures the time it takes (roundtrip!). | |
| import sys, time | |
| from socket import * | |
| MY_PORT = 50000 + 42 | |
| BUFSIZE = 1024 | |
| def main(): | |
| if len(sys.argv) < 2: | |
| usage() | |
| if sys.argv[1] == '-s': | |
| server() | |
| elif sys.argv[1] == '-c': | |
| client() | |
| else: | |
| usage() | |
| def usage(): | |
| sys.stdout = sys.stderr | |
| print 'Usage: (on host_A) throughput -s [port]' | |
| print 'and then: (on host_B) throughput -c count host_A [port]' | |
| sys.exit(2) | |
| def server(): | |
| if len(sys.argv) > 2: | |
| port = eval(sys.argv[2]) | |
| else: | |
| port = MY_PORT | |
| s = socket(AF_INET, SOCK_STREAM) | |
| s.bind(('', port)) | |
| s.listen(1) | |
| print 'Server ready...' | |
| while 1: | |
| conn, (host, remoteport) = s.accept() | |
| while 1: | |
| data = conn.recv(BUFSIZE) | |
| if not data: | |
| break | |
| del data | |
| conn.send('OK\n') | |
| conn.close() | |
| print 'Done with', host, 'port', remoteport | |
| def client(): | |
| if len(sys.argv) < 4: | |
| usage() | |
| count = int(eval(sys.argv[2])) | |
| host = sys.argv[3] | |
| if len(sys.argv) > 4: | |
| port = eval(sys.argv[4]) | |
| else: | |
| port = MY_PORT | |
| testdata = 'x' * (BUFSIZE-1) + '\n' | |
| t1 = time.time() | |
| s = socket(AF_INET, SOCK_STREAM) | |
| t2 = time.time() | |
| s.connect((host, port)) | |
| t3 = time.time() | |
| i = 0 | |
| while i < count: | |
| i = i+1 | |
| s.send(testdata) | |
| s.shutdown(1) # Send EOF | |
| t4 = time.time() | |
| data = s.recv(BUFSIZE) | |
| t5 = time.time() | |
| print data | |
| print 'Raw timers:', t1, t2, t3, t4, t5 | |
| print 'Intervals:', t2-t1, t3-t2, t4-t3, t5-t4 | |
| print 'Total:', t5-t1 | |
| print 'Throughput:', round((BUFSIZE*count*0.001) / (t5-t1), 3), | |
| print 'K/sec.' | |
| main() |