下面提到的全部是使用Python 2.7Python的插座听
你好,
我目前试图将套接字上侦听数据由远程程序发送Windows机器。然后将这些数据打印到屏幕上,然后请求用户输入,然后将其返回到远程程序。在测试中,我已经能够让远程程序给我一个命令行程序菜单(cmd,ipconfig,whoami,ftp),然后程序返回一个数字作为菜单选项的选择。
远程程序接收到我的响应并发送所选命令的输出。 ipconfig和whoami完美工作,但cmd和ftp只会返回终端的输出一次。 (即我可以输入一个命令到FTP程序,并发送过多的远程程序之前,我从来没有听到后面)
我的代码失败的部分是 if ready[0]:
永远不会成为第一个谈话后准备第二次。
我知道远程程序运行正常,因为我可以使用netcat代替我的代码并无限期地运行cmd终端。
我该如何正确实现一个可以解释这种连接类型的python套接字侦听器?
我的“节目”的全部:
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)
请让我知道如果你需要更多的信息,任何帮助将不胜感激,我很新的这一点,好学。
您是否尝试过使用“SocketServer”类?它有很好的文档记录,似乎比“套接字”更容易使用(也可以用于侦听):http://docs.python.org/2/library/socketserver.html – halflings 2013-04-08 00:04:01
这太复杂了,什么你想达到什么目的? – tomasz 2013-04-11 20:54:22