4

私はソケットプログラミングが初めてで(Pythonも多少)、選択タイムアウトを(サーバー側で)思い通りに機能させるのに問題があります。クライアントが接続する前に、タイムアウトは問題なく機能します。1 秒の値を指定すると、タイムアウトはループ内で 1 秒ごとに期限切れになります。

ただし、クライアントが接続すると、タイムアウトの期限が切れたことを通知するために 1 秒も待機しません。できるだけ速くループし、タイムアウトが期限切れになったことを通知します。これが私のコードのスニペットです:

while running:
    try:
        self.timeout_expired = False
        inputready, outputready, exceptready = select.select(self.inputs, self.outputs, [], self.timeout)
    except select.error, e:
        break
    except socket.error, e:
        break

    if not (inputready):
        # Timeout expired
        print 'Timeout expired'
        self.timeout_expired = True

    # Additional processing follows here

これが私の問題がどこにあるのかを確認するのに十分なコードかどうかはわかりませんので、もっと見る必要がある場合はお知らせください。基本的に、クライアントが接続した後、少なくとも1 秒のタイムアウトを無視し、できるだけ速く実行され、「タイムアウトの期限が切れました」と継続的に通知されるように見えます。私が見逃しているものはありますか?

どうもありがとう!!

編集:明確にする必要があります...「inputready」は、サーバーに接続またはデータを送信するクライアントからの入力と、サーバーからの標準入力を表します。selectから返される他の変数はサーバー側の変数のみであり、私がやろうとしているのは、CLIENTが応答するのに時間がかかりすぎたかどうかを検出することです。そのため、inputreadyが空かどうかのみを確認しています.

4

2 に答える 2

4

、、およびがすべて空の場合inputreadyは、タイムアウトになります。私の推測では、クライアントソケットをとの両方に追加しました。出力ソケットは通常書き込み可能であるため、常にに表示されます。何かを出力する準備ができている場合にのみ、クライアントソケットを追加してください。outputreadyexceptreadyself.inputsself.outputsoutputreadyself.outputs

于 2013-03-04T05:58:51.843 に答える