Socket.SendTimeout tidak membatasi upaya koneksi proxy
Batasi pemeriksaan port proxy saat pembentukan koneksi alih-alih menyetel timeout yang hanya berlaku untuk pengiriman data.
Pemeriksa proxy menyetel SendTimeout = 200, memanggil Connect, dan menunggu jauh lebih lama dari perkiraan. Timeout tersebut terikat pada operasi yang belum dicapai pemeriksa.
Socket.SendTimeout mengendalikan pengiriman sinkron. Itu tidak memberi upaya koneksi sinkron tenggat 200 ms. Menambahkan tidur sebelum Connect hanya menambah penundaan lain.
Batalkan operasi yang sedang menunggu
Pada target .NET modern yang menyediakan overload yang dapat dibatalkan, pemeriksaan asinkron dapat menerapkan anggarannya pada pembentukan koneksi:
using var budget = new CancellationTokenSource(TimeSpan.FromSeconds(2));
using var client = new TcpClient();
await client.ConnectAsync(proxyHost, proxyPort, budget.Token);
Fragmen itu berada dalam metode async, dengan host dan port proxy diberikan oleh pemanggil; kandidat publik dari daftar proxy dapat menyediakan kedua masukan itu. Tangani pembatalan secara terpisah dari kesalahan socket jika pemeriksa melaporkan alasan kegagalan. Membuang klien juga mencegah pemeriksaan yang selesai menumpuk socket.
Kode .NET Framework lama tidak memiliki setiap overload modern. Gunakan pengaturan koneksi asinkron yang didukung dan tutup socket secara eksplisit saat meninggalkan upaya itu. Hanya menghentikan penantian Anda tidak membuktikan bahwa operasi yang mendasarinya telah berhenti.
Hasil hijau tetap hasil kecil
Koneksi TCP yang berhasil membuktikan bahwa klien ini mencapai endpoint yang mendengarkan. Koneksi itu belum menegosiasikan SOCKS, belum mengautentikasi ke proxy HTTP, belum membuka CONNECT, dan belum menerima respons situs web yang diinginkan.
Beri tahap-tahap berikutnya penanganan terbatasnya sendiri, atau bawa tenggat keseluruhan yang disengaja melewatinya. Jika tidak, timer koneksi yang diperbaiki dapat bekerja sempurna sementara pemeriksa menghabiskan satu menit lagi menunggu handshake proxy.