Python 如何安全地将select与PyOpenSSL连接对象一起使用?
Windows Vista上的Python:2.7.2 Egenix PyOpenSSL:0.13.0 我正在尝试编写代理服务。基本上,代理服务侦听常规套接字和SSL套接字,在两者之间中继数据 我能够半可靠地中继数据,但当SSL套接字另一端的服务器发送完数据后,我会收到一个虚假信号,表示有更多数据可供读取。代码基本上如下所示:Python 如何安全地将select与PyOpenSSL连接对象一起使用?,python,pyopenssl,Python,Pyopenssl,Windows Vista上的Python:2.7.2 Egenix PyOpenSSL:0.13.0 我正在尝试编写代理服务。基本上,代理服务侦听常规套接字和SSL套接字,在两者之间中继数据 我能够半可靠地中继数据,但当SSL套接字另一端的服务器发送完数据后,我会收到一个虚假信号,表示有更多数据可供读取。代码基本上如下所示: (rs, ws, xs) = select.select([client, sslserver], [], []) for r in rs: if r == cl
(rs, ws, xs) = select.select([client, sslserver], [], [])
for r in rs:
if r == client:
# tons of client code
elif r == sslserver:
(rs, ws, xs) = select.select([sslserver], [], [], 0)
print 'Reading server: %s, %s' % (len(rs), server.pending())
while len(rs) > 0 or sslserver.pending() > 0:
t = sslserver.read(sslserver.pending())
# Do more useful stuff
(rs, ws, xs) = select.select([sslserver], [], [], 0)
有了这段代码,我有时会在进入读取块之前看到文本Reading server:1,0
。当我实际执行t=sslserver.read(sslserver.pending())
时,结果是一个折腾。我经常收到一个EOF异常(SSL.SysCallError()[1]==“意外的EOF”)。问题是,有时这是一个真正的EOF,有时SSL只是没有提供任何数据
但是,如果我把阅读行改成这样
t = sslserver.read(4096)
正如我在大多数套接字读取代码中的习惯一样,我的代码没有得到任何指示EOF的信息(常规套接字会这样做!select表示套接字已准备好读取。没有数据可读取。因此立即返回无数据!),而只是在没有数据可读取时阻塞代码。当然,这毫无意义。毕竟,插座已准备好读取。它应该一直阻塞,直到EOF通过解密阶段
但事实并非如此。这是一个永久性的街区
我有什么选择?我现在绝对相信select.select对于PyOpenSSL套接字是不安全的。是否有其他方法可以使用常规套接字监控SSL套接字,或者我是否需要将SSL套接字移动到单独的线程中,并使用普通套接字将数据中继到主线程中