Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何安全地将select与PyOpenSSL连接对象一起使用?_Python_Pyopenssl - Fatal编程技术网

Python 如何安全地将select与PyOpenSSL连接对象一起使用?

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

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 == 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套接字移动到单独的线程中,并使用普通套接字将数据中继到主线程中