私はソケットプログラミングが初めてで(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が空かどうかのみを確認しています.