wszystkich poniżej wymienionych jest na Windows maszyn przy użyciu Pythona 2.7Python Socket Słuchanie
Witam,
Jestem obecnie próbuje słuchać na gnieździe do przesyłu danych za pomocą zdalnego programu. Dane te są następnie drukowane na ekranie i wymagane jest wprowadzenie danych użytkownika, które następnie są zwracane do zdalnego programu. Podczas testów zdołałem wysłać do mnie program z programami wiersza poleceń (cmd, ipconfig, whoami, ftp), a następnie mój program zwraca z numerem jako wyborem opcji menu.
Zdalny program odbiera moją odpowiedź i wysyła dane wyjściowe wybranego polecenia. ipconfig i whoami działają doskonale, ale cmd i ftp tylko raz zwracają dane wyjściowe terminala. (To mogę wprowadzić jedną komendę do programu FTP i wyślij że zbyt zdalnego programu zanim nie słyszę z tyłu)
Część mojego kodu, która nie jest if ready[0]:
nigdy nie staje się gotowy po raz drugi po pierwszej rozmowie.
Wiem, że program zdalny działa poprawnie, ponieważ mogę używać netcata do działania zamiast kodu i obsługiwać terminalu cmd w nieskończoność.
Jak mogę poprawnie wdrożyć nasłuchiwacz gniazda Pythona, który może uwzględniać ten typ połączenia?
Moje „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)
Proszę dać mi znać, jeśli potrzebujesz więcej informacji, każda pomoc będzie mile widziana, jestem bardzo nowy w tym i chętny do nauki.
Czy próbowałeś za pomocą klasy "SocketServer"? Jest dobrze udokumentowany i wydaje się łatwiejszy w użyciu niż "gniazdo" (i może być również używany do słuchania): http://docs.python.org/2/library/socketserver.html – halflings
jest to zbyt skomplikowane, co czy próbujesz osiągnąć? – tomasz