Python:select()立即返回,无需读取数据(telnetlib)

2024-04-25 20:28:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我想使用^{}来阻止循环,直到可以从telnet会话列表中读取一些数据。但是,下面的代码不起作用,对select.select()的调用立即返回,没有要读取的数据。我在Ubuntu10.4下使用Python2.7.3。在

tn = telnetlib.Telnet(IP,23,TIMEOUT)
# [... logging and password omitted ..]

while True:
    logging.info("%d - waiting on select for data" % self.id)
    read_ready, write_ready, expt_ready = select.select([ tn.get_socket() ],[],[])
    logging.info("%d - select returned" % self.id)
    if len(read_ready) == 1:
        data = tn.read_eager()
        logging.info("%d read %d characters" % (self.id, len(data)))
        # ... continue processing the data...

输出示例:

^{pr2}$

set_debuglevel(1)为例:

2013-08-23 11:50:29,019 - INFO: 1 - waiting on select for data
2013-08-23 11:50:29,062 - INFO: 1 - select returned
Telnet(10.2.3.15,23): recv '\xff\xfe\x01'
Telnet(10.2.3.15,23): IAC DONT 1
2013-08-23 11:50:29,062 - INFO: 1 read 0 characters
2013-08-23 11:50:29,063 - INFO: 1 - waiting on select for data
2013-08-23 11:50:29,069 - INFO: 1 - select returned
Telnet(10.2.3.15,23): recv '\xff\xfe!'
Telnet(10.2.3.15,23): IAC DONT 33
2013-08-23 11:50:29,069 - INFO: 1 read 0 characters
2013-08-23 11:50:29,070 - INFO: 1 - waiting on select for data
2013-08-23 11:50:29,110 - INFO: 1 - select returned
Telnet(10.2.3.15,23): recv '\xff\xfc\x03'
Telnet(10.2.3.15,23): IAC WONT 3
2013-08-23 11:50:29,110 - INFO: 1 read 0 characters

Tags: selfinfoforreaddataonloggingselect
2条回答

答案在文档中:(pydoc telnetlib):

It is possible to pass a Telnet object to select.select() in order to wait until more data is available. Note that in this case, read_eager() may return '' even if there was data on the socket, because the protocol negotiation may have eaten the data.

从调试输出可以清楚地看出,远程端发送的是telnet命令,而不是实际数据,因此您必须调试telnet握手。在

正如“Stefano M”所说,这个问题与telnet会话选项协商有关。由于某些原因,客户机和服务器不断地交换选项,因此select.select()从未被阻止(总是有数据要读取)。在

我通过设置option negotiation callback找到了一个解决方法。在

Telnet.set_option_negotiation_callback(callback)
Each time a telnet option is read on the input flow, this callback (if set) is called with the following parameters : callback(telnet socket, command (DO/DONT/WILL/WONT), option). No other action is done afterwards by telnetlib.

相关问题 更多 >