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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top