Pregunta

Tengo un servidor de socket que estoy tratando de pasar a SSL en Python 2.5, pero me he encontrado con un obstáculo con pyOpenSSL. No puedo encontrar ningún buenos tutoriales sobre el uso, por lo que estoy operando en gran medida en conjeturas.

Así es como mi servidor establece la toma:

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)

Así es cómo acepta clientes:

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

Y aquí es cómo se envía / recibe de los conectores conectados:

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)

Es compacta, pero se entiende la idea general. El problema es, una vez que el envío / recepción comience el bucle, se muere de inmediato, antes de que algo se ha enviado o recibido (que puedo ver de todos modos):

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

La descripción del manual de la 'WantReadError' es muy vaga, que indique que puede provenir de cualquier lugar. ¿Qué estoy haciendo mal?

¿Fue útil?

Solución

A veces, con el fin de enviar bytes de aplicación de una conexión SSL, tiene que ser capaz de leer más bytes de la primera conexión. WantReadError es como se indica este caso. Lo único que estás haciendo mal es que no se está manejando la WantReadError y luego esperar hasta select indica que el zócalo esté legible antes de intentar llamar send de nuevo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top