Pergunta

Eu tenho um servidor de soquete que eu estou tentando passar para SSL em Python 2.5, mas eu correr em uma protuberância com pyOpenSSL. Não consigo encontrar qualquer bons tutoriais em usá-lo, por isso estou operando em grande parte em suposições.

Aqui está como meus Server configura o soquete:

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)

Aqui está como ele aceita clientes:

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

E aqui está como ele envia / recebe dos sockets 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)

É compactado, mas essa é a idéia geral. O problema é que, uma vez que o envio / recepção começa loop, ele morre de imediato, antes de qualquer coisa foi enviada ou recebida (que eu possa ver de qualquer maneira):

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

A descrição do manual da 'WantReadError' é muito vago, dizendo que ele pode vir de qualquer lugar. O que estou fazendo de errado?

Foi útil?

Solução

Às vezes, a fim de enviar pedido de bytes de uma conexão SSL, você precisa ser capaz de ler mais bytes da primeira conexão. WantReadError é como neste caso, é indicado. A única coisa que você está fazendo de errado é que você não está lidando com o WantReadError e depois esperar até select indica que o soquete é legível antes de tentar chamar send novamente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top