Słuchanie z gniazda Python
Wszystkie wymienione poniżej są na komputerach z systemem Windows za pomocą Pythona 2.7
Dzień dobry,
Obecnie próbuję nasłuchiwać na gnieździe danych wysyłanych przez zdalny program. Dane te są następnie drukowane na ekranie, a dane wejściowe użytkownika są wymagane, a następnie zwracane do zdalnego programu. W testach mogłem mieć zdalny program wysyłający mi menu programów wiersza poleceń (cmd, ipconfig, whoami, ftp), a następnie mój program zwraca liczbę jako wybór opcji menu.
Program zdalny odbiera moją odpowiedź i wysyła dane wyjściowe wybranego polecenia. ipconfig i whoami działają idealnie, ale cmd i ftp zwracają dane wyjściowe tylko raz. (Np. Mogę wprowadzić jedno polecenie do programu FTP i wysłać ten program zdalny, zanim nigdy nie usłyszę odpowiedzi)
Ta część mojego kodu, która się nie powiedzie, to taif ready[0]:
nigdy nie staje się gotowy po raz drugi po pierwszej rozmowie.
Wiem, że zdalny program działa poprawnie, ponieważ mogę użyć netcata do działania zamiast mojego kodu i obsługiwać terminal cmd w nieskończoność.
Jak mam właściwie zaimplementować nasłuchiwanie gniazda Pythona, które może uwzględniać ten typ połączenia?
Mój „program” w całości:
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)
Daj mi znać, jeśli potrzebujesz więcej informacji, każda pomoc byłaby bardzo mile widziana, jestem bardzo nowa i chętna do nauki.