なぜ、System.Net.Sockets.Socket.AcceptAsyncは、長時間の非アクティブ後にConnectionResetで完了しますか?

有効な SocketAsyncEventArgs Socket.AcceptAsync を呼び出し、 SocketAsyncEventArgs.Completed イベントを正しく設定して、非常に長い時間、接続をリセットするだけです。しかし、私の Socket.ReceiveTimeout Socket.SendTimeout はどちらもゼロです。

私はどのように接続を受け入れるためのタイムアウトを設定するか、それが良いアイデアであっても不明です。回避策があり、これがデフォルトの動作である理由に関する情報がありますか?

Microsoft Connectにバグ報告を提出して、彼らが何かの理由があるかどうかを確認してくださいタイムアウト期間が不安定な理由場合によっては5分後にタイムアウトし、2時間以上経過するとタイムアウトすることがあります。

7
私はもともと同じものを想定していたので、私はこれで混乱しているのです。私が話しているように私はwiresharkのロギングでテストを実行していて、結果が出たときに結果を投稿します。
追加された 著者 Michael J. Gray,
@NikolaiNFetissovあなたはそれを釘付け。最終的に問題の根を見つけました。
追加された 著者 Michael J. Gray,
wiresharkなんかで何が起こっているのか調べたことがありますか? ConnectionResetは、リスンソケットではなく、接続されているソケットに関連している必要があります。
追加された 著者 Nikolai Fetissov,

2 答え

After playing around with this for a bit I have found that a single SYN -> SYN-ACK -> RST sequence will raise the SocketAsyncEventArgs.Completed event and cause the SocketAsyncEventArgs.SocketError property to become SocketError.ConnectionReset. It appears this is expected behavior but it's definitely a gotcha and should be documented better.

サーバーをスキャンして半開きのSYN型スキャンを実行するポートは、同様のトラフィックを生成し、同じ問題を引き起こします。ソフトウェアのサービス拒否の脆弱性を防ぐために、この特別な条件を処理する必要があります。

4
追加された
@HarryMexican例外をキャプチャしてリソースを解放し、もう一度受け入れを開始する必要があります。 SYNスキャンをブロックする必要がある場合は、ステートフルなパケット検査と自動トラフィックフィルタリング、または非常に積極的なファイアウォールルールをサポートするファイアウォールが必要です。
追加された 著者 Michael J. Gray,
どのように扱うべきだと思いますか?例外を飲み込むか、接続を閉じるだけですか?
追加された 著者 Harry Mexican,

Maybe this could help: Socket problem: TcpClient.GetStream with ReceiveTimeout throws Exception and connected state become false

ソケットがタイムアウトすると、数秒(数分)ごとにアライブパケットを送信することもできます。

You could also keep an eye on the connection using Netstat -an | findstr /i "PORT#". You can find information about that at: TCP Connection States and Netstat Output

あなたの問題を追跡するのに役立つことを願っています。

1
追加された