4

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」に関するマニュアルの説明は非常に曖昧で、ほぼどこからでも発生する可能性があると述べています。私は何を間違っていますか?

4

1 に答える 1

6

場合によっては、SSL 接続のアプリケーション バイトを送信するために、最初に接続からより多くのバイトを読み取ることができる必要があります。 WantReadErrorこの場合の表示方法です。あなたが間違っている唯一のことは、を処理せず、ソケットが読み取り可能WantReadErrorであることを示すまで待ってから、再度呼び出しを試みることです。selectsend

于 2011-02-27T13:53:05.960 に答える