pyOpenSSL 与 WantReadError

4 投票
1 回答
3546 浏览
提问于 2025-04-15 20:19

我有一个套接字服务器,想把它转到SSL上,使用的是Python 2.5,但在使用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)

这是它如何接受客户端的:

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

这是它如何从连接的套接字发送和接收数据的:

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)

虽然内容简化了,但大致意思是这样的。问题是,一旦发送/接收循环开始,它就立刻崩溃了,在我能看到的情况下,什么都没有发送或接收:

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

手册中对'WantReadError'的描述非常模糊,说这个错误可能来自几乎任何地方。我到底哪里做错了呢?

1 个回答

6

有时候,为了通过SSL连接发送应用程序的数据,你需要先从连接中读取更多的数据。WantReadError就是用来表示这种情况的。你唯一做错的就是没有处理这个WantReadError,然后在select告诉你这个连接可以被读取之前,就试图再次调用send

撰写回答