下面提到的所有内容都在使用Python2.7的windows计算机上
你好
我目前正试图在一个套接字上监听远程程序发送的数据。然后将这些数据打印到屏幕上,请求用户输入,然后返回到远程程序。在测试中,我可以让远程程序向我发送一个命令行程序菜单(cmd、ipconfig、whoami、ftp),然后我的程序返回一个数字作为菜单选项的选择。
远程程序接收我的响应并发送所选命令的输出。ipconfig和whoami工作得很好,但是cmd和ftp只返回一次终端的输出。(也就是说,我可以在FTP程序中输入一个命令,然后在我没有回音之前将其发送给远程程序)
我的代码中失败的部分是
if ready[0]:
在第一次对话之后,永远不要第二次准备就绪。
我知道远程程序运行正常,因为我可以使用netcat代替我的代码,无限期地操作命令终端。
如何正确实现能够解释这种连接的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)
如果你需要更多的信息,请告诉我,任何帮助将非常感谢,我是非常新的,并渴望学习。
玩了一会儿终于让它在使用Python2.7的本地telnet会话中运行得很好。
它所做的是设置一个线程,当客户端连接侦听客户端内容时运行。
当客户端发送一个返回时(“\r\n”如果您与Linux系统交互,则可能需要更改该值?)消息将打印到服务器,如果服务器端有原始输入,则会将此消息发送到客户端:
以上答案仅适用于一个连接。我已经通过添加另一个连接线程来更新它。现在可以有多个用户连接。
客户端无法看到其他客户端所说的话,来自服务器的消息将发送到所有客户端。我把这留给读者作为练习。
如果您现在在Python 3中仍然想知道sockets,那么下面是使用它们的基本方法:
服务器.py
客户端.py
先运行server.py,然后运行client.py
这只是接收和发送当前时间。
Python3.4套接字有什么新功能?
Python2.7套接字和Python3.4套接字的一个主要区别是发送消息。必须
.encode()
(通常使用'ascii'或blank作为参数/参数) 然后使用.decode()
例如,使用
.encode()
发送,使用.decode()
接收。额外信息:client/server socket tutorial
相关问题 更多 >
编程相关推荐