pyOpenSSL和WantReadError

dir*_*ion 2 python ssl pyopenssl

我有一个套接字服务器,我试图在python 2.5上转移到SSL,但我遇到了pyOpenSSL的障碍.我找不到任何关于使用它的好教程,所以我主要依靠猜测.

以下是我的服务器如何设置套接字:

ctx = SSL.Context(SSL.SSLv23_METHOD)
ctx.use_privatekey_file ("mykey.pem")
ctx.use_certificate_file("mycert.pem")
sock = SSL.Connection(ctx, socket.socket(socket.AF_INET, socket.SOCK_STREAM))
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
addr = ('', int(8081))
sock.bind(addr)
sock.listen(5)
Run Code Online (Sandbox Code Playgroud)

以下是它如何接受客户:

sock.setblocking(0)
while True:
  if len(select([sock], [], [], 0.25)[0]):
    client_sock, client_addr = sock.accept()
    client = ClientGen(client_sock)
Run Code Online (Sandbox Code Playgroud)

以下是它从连接的套接字发送/接收的方式:

while True:
  (r, w, e) = select.select([sock], [sock], [], 0.25)

  if len(r):
    bytes = sock.recv(1024)
  if len(w):
    n_bytes = sock.send(self.message)
Run Code Online (Sandbox Code Playgroud)

它是紧凑的,但你得到了一般的想法.问题是,一旦发送/接收循环开始,它就会在发送或接收任何内容之前立即死亡(我无论如何都可以看到):

Traceback (most recent call last):
  File "ClientGen.py", line 50, in networkLoop
    n_bytes = sock.send(self.message
WantReadError
Run Code Online (Sandbox Code Playgroud)

手册中对'WantReadError'的描述非常模糊,说它几乎可以来自任何地方.我究竟做错了什么?

Jea*_*one 5

有时,为了发送SSL连接的应用程序字节,您需要能够首先从连接中读取更多字节. WantReadError是如何指出这种情况.你唯一错误的是你没有处理它WantReadError然后等待直到你再次尝试呼叫之前select表明套接字是可读的send.