+#!/usr/bin/env python
+
+import sys
+import time
+from optparse import OptionParser
+import socket
+import SocketServer
+
+def myprint(message):
+ now=time.strftime("%H:%M:%S", time.localtime())
+ print "*",now,'--',message
+
+class EchoRequestHandler(SocketServer.StreamRequestHandler):
+ def handle(self):
+ line = self.rfile.readline()
+ self.wfile.write(line)
+
+class UppercaseRequestHandler(SocketServer.StreamRequestHandler):
+ def handle(self):
+ line = self.rfile.readline()
+ self.wfile.write(line.upper())
+
+class Server:
+
+ def main(self):
+ import threading
+
+ parser=OptionParser()
+ parser.add_option("-p","--port", action="store", dest="port", type="int",
+ default=10000, help="port number")
+ parser.add_option("-a","--address", action="store", dest="address",
+ default=socket.gethostname(), help="address")
+ parser.add_option("-t","--timeout", action="store", dest="timeout", type="int",
+ default="0")
+
+ (options, args) = parser.parse_args()
+ if len(args) != 0:
+ parser.print_help()
+ sys.exit(1)
+
+ server = SocketServer.TCPServer((options.address, options.port),
+ UppercaseRequestHandler)
+
+ try:
+ if options.timeout:
+ t = threading.Thread(target=server.serve_forever)
+ t.setDaemon(True) # don't hang on exit
+ t.start()
+ time.sleep(options.timeout)
+ sys.exit(0)
+ else:
+ server.serve_forever()
+ except KeyboardInterrupt:
+ print 'Bailing out'
+ sys.exit(1)
+
+class Client:
+ def main(self):
+ from optparse import OptionParser
+
+ parser=OptionParser()
+ parser.add_option("-p","--port", action="store", dest="port", type="int",
+ default=10000, help="port number")
+ parser.add_option("-a","--address", action="store", dest="address",
+ default=socket.gethostname(), help="address")
+ parser.add_option("-s","--sleep", action="store", dest="sleep", type="int",
+ default=1, help="sleep seconds")
+ parser.add_option("-l","--loops", action="store", dest="loops", type="int",
+ default=1, help="iteration loops")
+
+ (options, args) = parser.parse_args()
+ if len(args) != 0:
+ parser.print_help()
+ sys.exit(1)
+
+ result=True
+ for i in range(1,options.loops+1):
+ s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ s.connect((options.address , options.port))
+ mout=i*'ping ' + '\n'
+ min=mout.upper()
+ if s.send(mout) != len(mout):
+ myprint("cannot send %s"%mout.strip())
+ result=False
+ break
+ line=s.recv(len(min))
+ if line is not line:
+ myprint("unexpected reception\ngot:%s\nexpected: %s",line,min)
+ result=False
+ else:
+ myprint("OK:%s"%mout.strip())
+ # leave the connection open, but the last one (so 1 iter returns fast)
+ if i != options.loops:
+ time.sleep(options.sleep)
+ myprint("disconnecting")
+ s.close()
+ myprint("Done")
+ exit_return=0
+ if not result: exit_return=1
+ sys.exit(exit_return)
+
+if __name__ == '__main__':
+ for argv in sys.argv[1:]:
+ if argv.find("client") >= 0:
+ sys.argv.remove(argv)
+ Client().main()
+ elif argv.find("server") >= 0:
+ sys.argv.remove(argv)
+ Server().main()
+ print 'you must specify either --client or --server'
+ sys.exit(1)