Socket.SendTimeout không giới hạn một lần thử kết nối proxy
Giới hạn việc kiểm tra cổng proxy lúc thiết lập kết nối thay vì đặt một timeout chỉ áp dụng cho việc gửi dữ liệu.
Một trình kiểm tra proxy đặt SendTimeout = 200, gọi Connect và chờ lâu hơn nhiều so với dự kiến. Timeout gắn với một thao tác mà trình kiểm tra chưa chạm tới.
Socket.SendTimeout điều khiển các lần gửi đồng bộ. Nó không cho một lần thử kết nối đồng bộ thời hạn 200 ms. Thêm thời gian ngủ trước Connect chỉ thêm một độ trễ nữa.
Hủy thao tác đang chờ
Trên một đích .NET hiện đại cung cấp overload có thể hủy, một lần kiểm tra bất đồng bộ có thể áp ngân sách của nó vào việc thiết lập kết nối:
using var budget = new CancellationTokenSource(TimeSpan.FromSeconds(2));
using var client = new TcpClient();
await client.ConnectAsync(proxyHost, proxyPort, budget.Token);
Đoạn mã thuộc một phương thức async, với máy chủ và cổng proxy do bên gọi cung cấp; một ứng viên công khai từ danh sách proxy có thể cung cấp hai đầu vào đó. Xử lý việc hủy tách biệt khỏi lỗi socket nếu trình kiểm tra báo lý do thất bại. Việc giải phóng client cũng ngăn các lần kiểm tra đã xong tích tụ socket.
Mã .NET Framework cũ không có mọi overload hiện đại. Hãy dùng một cách bố trí kết nối bất đồng bộ được hỗ trợ và đóng socket rõ ràng khi từ bỏ lần thử. Chỉ dừng việc chờ của bạn không chứng minh rằng một thao tác bên dưới đã dừng.
Kết quả xanh vẫn là kết quả nhỏ
Một kết nối TCP thành công chứng minh rằng client này đã tới một điểm cuối đang lắng nghe. Nó chưa thương lượng SOCKS, chưa xác thực với proxy HTTP, chưa mở CONNECT và chưa nhận phản hồi trang web mong muốn.
Hãy cho các giai đoạn sau đó cách xử lý có giới hạn riêng, hoặc mang một thời hạn tổng thể có chủ đích xuyên qua chúng. Nếu không, bộ đếm thời gian kết nối đã sửa có thể chạy hoàn hảo trong khi trình kiểm tra dành thêm một phút chờ bắt tay proxy.