pyOpenSSL и ошибка WantReadError
Вопрос
У меня есть сервер сокетов, который я пытаюсь перевести на 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' в руководстве очень расплывчатое, говорится, что оно может исходить практически из любого места.Что я делаю не так?
Решение
Иногда, чтобы отправить байты приложения из SSL-соединения, вам нужно сначала иметь возможность прочитать больше байтов из соединения. WantReadError
вот как обозначен этот случай.Единственное, что вы делаете неправильно, это то, что вы не справляетесь с WantReadError
а затем ждать, пока select
указывает, что сокет читаемый прежде чем вы попытаетесь позвонить send
снова.