pyOpenSSL SSL3_WRITE_PENDING:坏写重试,返回self._sslobj.w

2019-10-19 04:00发布

我现在使用Python开发一个聊天服务器。 我在申请pyOpenSSL到聊天服务器和我所规定的试验假人客户的中间。 但每当从虚拟客户发送短信和照片文件到服务器,pyOpenSSL返回驱动我停止使用pyOpenSSL像下面显著错误。

send_text_message() : exception : [Errno 1] _ssl.c:1309: error:1409F07F:SSL routines:SSL3_WRITE_PENDING:bad write retry
send_text_message() : exception : [Errno 1] _ssl.c:1309: error:1409F07F:SSL routines:SSL3_WRITE_PENDING:bad write retry
send_text_message() : exception : [Errno 1] _ssl.c:1309: error:1409F07F:SSL routines:SSL3_WRITE_PENDING:bad write retry
send_text_message() : exception : [Errno 1] _ssl.c:1309: error:1409F07F:SSL routines:SSL3_WRITE_PENDING:bad write retry
send_text_message() : exception : [Errno 1] _ssl.c:1309: error:1409F07F:SSL routines:SSL3_WRITE_PENDING:bad write retry
send_text_message() : exception : [Errno 1] _ssl.c:1309: error:1409F07F:SSL routines:SSL3_WRITE_PENDING:bad write retry
send_text_message() : exception : [Errno 1] _ssl.c:1309: error:1409F07F:SSL routines:SSL3_WRITE_PENDING:bad write retry

你可以让我知道如何解决这个错误? 还有一个更导致虚拟客户死亡的错误。

[client1|chatting1A] socket closed : device_id : client1, client_chatting_id : chatting1A, error : [Errno 10053] 
Exception in thread Thread-8:
Traceback (most recent call last):
  File "C:\Python27\lib\threading.py", line 810, in __bootstrap_inner
    self.run()
  File "C:\Python27\lib\threading.py", line 1082, in run
    self.function(*self.args, **self.kwargs)
  File "D:\temp\uTok1\uTokSocketServer\com\rurusoft\utok\DummyClient.py", line 97, in send_photo_message
    sock.write(message)
  File "C:\Python27\lib\ssl.py", line 172, in write
    return self._sslobj.write(data)
error: [Errno 10054]

如果没有pyOpenSSL,虚拟客户端和服务器工作。 应用pyOpenSSL会导致意想不到的问题:(如果你遇到的问题,或者对问题的解决方案,请让我知道。......如果有到错误没有解决方案,我宁愿找到其他替代品不使用OpenSSL。 。或者你知道它可以加密/解密聊天消息和机器之间转移个人文件的任何alterntives?

虽然在一个局部变量写入(发送)数据之前,发送我已经存储的数据,错误发生每次。


  json_encoded = json.dumps(data)
          while True:
              try:
                  sock.write(json_encoded)
                  break
              except Exception, e:
                  Log.print_log(self.LOG_TAG, 'send_text_message() : exception : %s' % (e))
                  time.sleep(0.05)

解决:作为@大卫·施瓦茨评论,下面的代码解决了上面的问题。

  import StringIO ... io = StringIO.StringIO() io.write(json.dumps(data)) buffer = io.getvalue() while True: try: sock.write(buffer) break ... 

Answer 1:

OpenSSL的大约有写如何重审要求非常严格 - 特别是缓冲区的地址和内容不得更改。 当你重试写入,必须使用完全相同的缓冲区(相同的内容是不够的,当然,不同的内容是绝对禁止的)重试。

例如,这是破:

ssl_socket.send(send_buffer.getvalue())

因为你没有保存你传递给价值send ,如果你需要重试send ,你怎么把它传递相同的值? 有没有保证后续调用getvalue将返回相同的结果。 重复该操作可以产生一个坏的写入重试如果缓冲运动时,它可以在任何时间。

更新 :您的代码也无法抑制对缓冲区的改变。 有没有对象不改变,反映了缓冲区。 尝试:

io = StringIO()
json.dumps(data, io)
buffer = io.getvalue()

      while True:
          try:
              sock.write(buffer)
              break

在这里, io是缓冲区, getvalue被称为上它只有一次。



文章来源: pyOpenSSL SSL3_WRITE_PENDING:bad write retry, return self._sslobj.write(data) error: [Errno 10054]