0

asyncore および asynchat モジュールを使用して SMTP サーバーを構築しています (SMTP サーバーを構築するために smtpd lib のコードを使用しました) が、接続タイムアウトに問題があります。SMTP サーバーへの telnet 接続を開いてそのままにしておくと、データ交換は行われませんが、接続は確立されます。たとえば 30 秒などのタイムアウトを設定し、クライアントから何も来ない場合はサーバーによってアイドル状態の接続を閉じます (そうしないと、簡単な DOS の脆弱性が存在する可能性があります)。解決策を探し、ソース コードとドキュメントを読みましたが、使用できるものは見つかりませんでした。

ありがとう

4

1 に答える 1

0

asyncore ドキュメントによるとasyncore.loop()、タイムアウト パラメータがあり、デフォルトは 30 秒です。したがって、明らかにデフォルトはすでに 30 秒である必要があります。自分のニーズに合わせて試してみることができます。

timeout 引数は、適切な select() または poll() 呼び出しのタイムアウト パラメータを秒単位で設定します。デフォルトは 30 秒です。


poll()わかりました、上記は実際にはまたはタイムアウトを指してselect()おり、アイドルタイムアウトではありません。このページに従って、非同期コアをハックして、次のようなタイムアウトをサポートできます。

asyncore.pollブロックの直後の独自のコピーに次のブロックを追加しますfor fd in e:...

#handle timeouts
rw = set(r) + set(w)
now = time.time()
for f in (i for i in rw if i in map):
    map[f].lastdata = now
    for j in (map[i] for i in map if i not in rw):
        if j.timeout+j.lastdata now:
            #timeout!
            j.handle_close()

インスタンスごとに .ti​​meout および .lastdata メンバーを初期化する必要がありますが、それほど悪くはありません (タイムアウトしないソケットの場合、実際には 1 時間または 1 日のタイムアウトをお勧めします)。

于 2012-10-13T13:26:43.417 に答える