プロキシチェッカーは SendTimeout = 200 を設定し、Connect を呼び出して、想定よりはるかに長く待機します。タイムアウトは、チェッカーがまだ到達していない操作に結び付いています。

Socket.SendTimeout が制御するのは同期送信です。同期の接続試行に 200 ms の期限を与えるものではありません。Connect の前にスリープを足しても、遅延がもう一つ増えるだけです。

待機している操作を取り消す

キャンセル可能なオーバーロードを提供する現代の .NET ターゲットでは、非同期の検査が予算を接続確立に適用できます。

using var budget = new CancellationTokenSource(TimeSpan.FromSeconds(2));
using var client = new TcpClient();
await client.ConnectAsync(proxyHost, proxyPort, budget.Token);

この断片は async メソッドに属し、プロキシのホストとポートは呼び出し元が提供します。プロキシ一覧の公開候補からその 2 つの入力を受け取れます。チェッカーが失敗理由を報告する場合は、キャンセルをソケットエラーとは別に扱ってください。クライアントを破棄すれば、完了した検査がソケットを溜め込むことも防げます。

古い .NET Framework のコードには、現代のオーバーロードがすべてあるわけではありません。対応している非同期の接続構成を使い、試行を諦めるときはソケットを明示的に閉じてください。待機を止めるだけでは、背後の操作が止まったことの証明にはなりません。

緑の結果はやはり小さな結果である

TCP 接続の成功は、このクライアントが待ち受けている端点に到達したことだけを示します。 SOCKS の交渉も、HTTP プロキシへの認証も、CONNECT の開始も、目的の Web サイトの応答の受信も済んでいません。

後続の段階には独自の制限付き処理を与えるか、意図した全体の期限をそれらに通してください。さもなければ、修正した接続タイマーが完璧に機能している間に、チェッカーはプロキシのハンドシェイクを待ってさらに 1 分を費やします。

関連記事