pyOpenSSL и WantReadError - PullRequest
       16

pyOpenSSL и WantReadError

2 голосов
/ 11 марта 2010

У меня есть сервер сокетов, который я пытаюсь перейти на 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 Ответ

5 голосов
/ 27 февраля 2011

Иногда для отправки прикладных байтов SSL-соединения вам необходимо сначала прочитать больше байтов из соединения. WantReadError как указано в этом случае. Единственное, что вы делаете неправильно, это то, что вы не обрабатываете WantReadError, а затем ждете, пока select не покажет, что сокет читабелен , прежде чем пытаться вызвать send снова.

...