Python Socket Listening

Todo lo que se menciona a continuación es en máquinas con Windows que utilizan Python 2.7.

Hola,

Actualmente estoy intentando escuchar en un socket el envío de datos por un programa remoto. Estos datos se imprimen en la pantalla y se solicitan las entradas del usuario que luego se devuelven al programa remoto. En las pruebas, he podido hacer que el programa remoto me envíe un menú de programas de línea de comandos (cmd, ipconfig, whoami, ftp) y luego mi programa vuelve con un número como una selección de la opción de menú.

El programa remoto recibe mi respuesta y envía la salida del comando seleccionado. ipconfig y whoami funcionan perfectamente, pero cmd y ftp solo devuelven la salida del terminal una vez. (I.E. Puedo ingresar un comando en el programa FTP y enviarlo también al programa remoto antes de que nunca vuelva a escuchar)

La parte de mi código que falla es queif ready[0]: Nunca se prepara una segunda vez después de la primera conversación.

Sé que el programa remoto está funcionando correctamente, ya que puedo usar netcat para actuar en lugar de mi código y operar el terminal cmd indefinidamente.

¿Cómo hago para implementar correctamente una escucha de socket de Python que pueda explicar este tipo de conexión?

Mi "programa" en su totalidad:

import socket, sys, struct, time, select

host = ''
port = 50000
connectionSevered=0

try:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error:
    print 'Failed to create socket'
    sys.exit()
print '[+] Listening for connections on port '+str(port)+'.'

s.bind((host,port))
s.listen(5)         

def recvall(the_socket,timeout=2):
    global connectionSevered
    data='';          # Data found by recv
    total_data=[];    # Finally list of everything

    s.setblocking(0)  #make socket non blocking
    begin=time.time() #beginning time

    while 1:
        ready = select.select([client], [], [], .2)
        if time.time()-begin > timeout:
            print 'Timeout reached'
            #Leave loop, timer has reached its threshold
            break
        if ready[0]:
            print 'In ready loop!'
            try:
                data = client.recv(4096)    #attempt to fetch data
                if data:
                    begin=time.time()       #reset timeout timer
                    total_data.append(data) 
                    data='';
            except socket.error:
                print '[+] Lost connection to client. Printing buffer...'
                connectionSevered=1   # Let main loop know connection has errored
                pass
        time.sleep(1)
    #join all parts to make final string
    return ''.join(total_data)

client, address = s.accept()
print '[+] Client connected!'

while (connectionSevered==0): # While connection hasn't errored
    print "connectionSevered="+str(connectionSevered) # DEBUG
    recvall(s)
    response = raw_input()                  #take user input
    client.sendto(response)                   #send input
client.close(0)

Por favor, avíseme si necesita más información, cualquier ayuda sería muy apreciada, soy muy nuevo en esto y estoy ansioso por aprender.

Respuestas a la pregunta(2)

Su respuesta a la pregunta