#! /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() |