8

私は、クライアントがTCP接続に接続し、それが完了するまでに多くの時間がかかる可能性のある大量の作業をトリガーするアプリケーションに取り組んでいます。ユーザーがTCP接続を切断した場合は、この作業をキャンセルする必要があります。

現在、私が行っているのは、次のようにしてネットワークストリームの接続を定期的にチェックするタイマーを起動することです。

// stream is a Stream instance
var abort = false;
using (new Timer(x => {
   try
   {
      stream.Write(new byte[0], 0, 0);
   }
   catch (Exception)
   {
      abort = true;
   }
}, null, 1000, 1000))
{
   // Do expensive work here and check abort periodically
}

を読みたかったCanWriteCanReadですConnectedが、ストリームの最後のステータスが報告されます。ゼロバイトを書き込むことは接続性をテストする信頼できる方法ですか、それともこれ自体が問題を引き起こす可能性がありますか?クライアントを混乱させるため、ストリームに実際のデータを書き込んだり読み取ったりすることはできません。

4

1 に答える 1

3

数十年前に私がそれが機能することを知っていたとだけ言いましょう、しかしそれが必要な本質的な理由はありません。あなたとTCPスタックの間のAPIレイヤーはいずれも、次のレイヤーへの呼び出しを抑制する権利があり、スタックに完全に到達した場合でも、次の場合にのみエラーを返します。

  1. 実装に依存する長さがゼロであるかどうかをチェックする前に、ネットワークエラーをチェックします。
  2. 以前の操作または着信RSTが原因で、すでにネットワークエラーが発生していました。

ネットワークを魔法のようにもう一方の端までプローブすることを期待している場合は、間違いなくそうはなりません。

于 2012-08-01T09:14:56.207 に答える