pyOpenSSL e la WantReadError
Domanda
Ho un server socket che sto cercando di passare al SSL su Python 2.5, ma ho incontrato un intoppo con pyOpenSSL. Non riesco a trovare qualsiasi buoni tutorial sull'uso di esso, così sto operando in gran parte su congetture.
Ecco come il mio server imposta il 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)
Ecco come accetta clienti:
sock.setblocking(0)
while True:
if len(select([sock], [], [], 0.25)[0]):
client_sock, client_addr = sock.accept()
client = ClientGen(client_sock)
E qui è come si invia / riceve dalle prese collegate:
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)
E 'compattato, ma si ottiene l'idea generale. Il problema è che, una volta che l'invio / ricezione inizia ciclo, muore subito, prima di tutto è stato inviato o ricevuto (che posso vedere in ogni caso):
Traceback (most recent call last):
File "ClientGen.py", line 50, in networkLoop
n_bytes = sock.send(self.message
WantReadError
La descrizione del manuale del 'WantReadError' è molto vago, dicendo che può venire da un po 'ovunque. Che cosa sto facendo di sbagliato?
Soluzione
A volte, al fine di inviare byte applicazione di una connessione SSL, è necessario essere in grado di leggere più byte dalla prima connessione. WantReadError
è come questo caso è indicato. L'unica cosa che si sta facendo male è che non sei la gestione della WantReadError
e quindi in attesa fino a quando select
indica che la presa sia leggibile prima di provare a chiamare di nuovo send
.