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.