프록시 검사기는 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 메서드에 속하며, 프록시 호스트와 포트는 호출자가 제공합니다. 프록시 목록의 공개 후보에서 그 두 입력을 받을 수 있습니다. 검사기가 실패 사유를 보고한다면 취소를 소켓 오류와 별도로 처리하십시오. 클라이언트를 삭제하면 완료된 검사가 소켓을 쌓는 것도 막을 수 있습니다.

오래된 .NET Framework 코드에는 최신 오버로드가 모두 있지 않습니다. 지원되는 비동기 연결 방식을 사용하고 시도를 포기할 때 소켓을 명시적으로 닫으십시오. 기다림을 멈추는 것만으로는 하위 작업이 멈췄다는 것이 증명되지 않습니다.

초록색 결과도 여전히 작은 결과다

TCP 연결 성공은 이 클라이언트가 수신 대기 중인 끝점에 도달했다는 것만 증명합니다. SOCKS 협상도, HTTP 프록시 인증도, CONNECT 개시도, 원하는 웹사이트 응답 수신도 끝나지 않았습니다.

그 이후 단계에는 각자의 제한된 처리를 주거나, 의도한 전체 기한을 그 단계들을 통해 전달하십시오. 그렇지 않으면 수정된 연결 타이머가 완벽하게 작동하는 동안 검사기는 프록시 핸드셰이크를 기다리며 1분을 더 보냅니다.

관련 글