pyOpenSSL et WantReadError
Question
J'ai un serveur socket que je suis en train de passer à SSL sur Python 2.5, mais j'ai rencontré un accroc avec pyOpenSSL. Je ne peux pas trouver de bons tutoriels sur l'utilisation, donc je suis en grande partie d'exploitation sur des suppositions.
Voici comment définit mon serveur le socket:
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)
Voici comment il accepte les clients:
sock.setblocking(0)
while True:
if len(select([sock], [], [], 0.25)[0]):
client_sock, client_addr = sock.accept()
client = ClientGen(client_sock)
Et voici comment il envoie / reçoit des prises connectées:
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)
Il est compact, mais vous avez l'idée générale. Le problème est, une fois qu'il meurt tout de suite l'envoi / réception démarre en boucle, avant quoi que ce soit a été envoyé ou reçu (que je peux voir quand même):
Traceback (most recent call last):
File "ClientGen.py", line 50, in networkLoop
n_bytes = sock.send(self.message
WantReadError
La description de la « WantReadError » du manuel est très vague, en disant qu'il peut venir d'un peu partout. Qu'est-ce que je fais mal?
La solution
Parfois, afin d'envoyer des octets d'application d'une connexion SSL, vous devez être capable de lire plus d'octets à partir de la première connexion. WantReadError
est de savoir comment ce cas est indiqué. La seule chose que vous faites mal est que vous n'êtes pas manipuler le WantReadError
et puis d'attendre jusqu'à ce que select
indique que la prise est lisible avant d'essayer d'appeler send
à nouveau.