pyOpenSSLとWantReadError
質問
私は私のpython 2.5でSSLを上に移動しようとしているソケットサーバーを持っているが、私はpyOpenSSLと思わぬ障害に遭遇しました。私はそれを使用して上の任意の良いチュートリアルを見つけることができないので、私は推測に大きく動作しています。
ここに私のサーバーは、ソケットを設定する方法です。
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)
ここでは、クライアントを受け入れる方法です。
sock.setblocking(0)
while True:
if len(select([sock], [], [], 0.25)[0]):
client_sock, client_addr = sock.accept()
client = ClientGen(client_sock)
そして、ここではそれが/は、接続されたソケットから受け取る送信する方法であります
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)
これは圧縮されますが、あなたは一般的なアイデアを得ます。送信が/ループ開始を受けたら、問題は何が送信または受信される前に、それは、すぐに死ぬ、である(私はとにかく見ることができる):
Traceback (most recent call last):
File "ClientGen.py", line 50, in networkLoop
n_bytes = sock.send(self.message
WantReadError
「WantReadError」のマニュアルの説明は、それがちょうど約どこから来ることができると言って、非常にあいまいです。私が間違って何をしているのですか?
解決
は、時々、SSL接続のアプリケーションのバイトを送信するために、あなたが最初の接続からより多くのバイトを読み取ることができるようにする必要があります。 WantReadError
は、このケースが示されている方法です。あなたは間違ってやっている唯一のことは、あなたがWantReadError
を処理し、その後select
はあなたが再びsend
を呼び出す前に、ソケットはのの読み取り可能であることを示すまで待機していないということです。
所属していません StackOverflow