#!/usr/bin/env python
# TCP server
'''
Python TCP server demo

DISCLAIMER: USE CODE AT YOUR OWN RISK!
!!! OPENS _HUGE_ SECURITY HOLE !!!
* work in progress
* no functional error handling, client disconnecting, etc.
* world read and writable port

2015-03-05 - Michael Hartl <hartl@mpe.mpg.de>

Usage: tcpsrv <port>
'''

print __doc__

import socket as soc
# import string
import sys

NBUF = 1024
STOP = False

# Send data
def srv_send(data):
    'Send data as a string'
    clt.send(repr(data))

# Stop client (non functional)
def srv_stop(): 
    'Stop client'
    global STOP
    clt.close()
    print '... disconnect'
    STOP = True

if __name__ == '__main__':

    # Prog ID, hostname, and port
    prog = str(sys.argv[0])
    host = ''                   # localhost
    port = int(sys.argv[1])     # port

    # Initialize TCP port ("socket")
    srv = soc.socket(soc.AF_INET, soc.SOCK_STREAM)
    srv.bind((host, port))
    srv.listen(1)
    
    # Dispatch loop
    print '... '+prog+' starting'
    
    while True:
        clt, adr = srv.accept()
        print '... connect to '+str(adr)
        STOP = False
        while (not STOP):
            cmd = clt.recv(NBUF)
            cmd = cmd[:-1].strip()
            print cmd
            try:
                exec(cmd)
            except (StandardError, TypeError), err:
                print 'Error: '+str(err)
                srv_send('Error: '+str(err))
            srv_send('\0')

    # Stop server
    print '... '+prog+' stopping'
    srv.close()
