1

現在、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

エラーの解決方法を教えていただけないでしょうか。ダミークライアントを停止させるエラーがもう 1 つあります。

[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 を使用しない他の代替手段を見つけたいと思います.または、マシン間で転送されるチャット メッセージと個人ファイルを暗号化/復号化できる代替手段を知っていますか?

データを書き込む(送信する)前に、送信するデータをローカル変数に格納しましたが、毎回エラーが発生します。


  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)

解決済み : @David Schwartz がコメントしたように、次のコードは上位の問題を解決しました。

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

4

1 に答える 1

2

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一度だけ呼び出されます。

于 2013-12-21T04:33:04.043 に答える