Socket.SendTimeout تلاش اتصال پروکسی را محدود نمیکند
بررسی پورت پروکسی را در زمان برقراری اتصال محدود کنید، نه با تعیین مهلتی که فقط برای ارسال داده اعمال میشود.
یک بررسیکنندهٔ پروکسی SendTimeout = 200 را تنظیم میکند، Connect را فراخوانی میکند و بسیار بیشتر از انتظار منتظر میماند. مهلت به عملیاتی گره خورده است که بررسیکننده هنوز به آن نرسیده است.
Socket.SendTimeout ارسالهای همگام را کنترل میکند. به یک تلاش اتصال همگام مهلت 200 ms نمیدهد. افزودن خواب پیش از Connect فقط تأخیر دیگری اضافه میکند.
عملیاتی را که منتظر است لغو کنید
روی یک هدف مدرن .NET که overload قابللغو را ارائه میدهد، یک بررسی ناهمگام میتواند بودجهٔ خود را روی برقراری اتصال اعمال کند:
using var budget = new CancellationTokenSource(TimeSpan.FromSeconds(2));
using var client = new TcpClient();
await client.ConnectAsync(proxyHost, proxyPort, budget.Token);
این قطعه به یک متد async تعلق دارد و میزبان و پورت پروکسی را فراخواننده تأمین میکند؛ یک نامزد عمومی از فهرست پروکسی میتواند آن دو ورودی را بدهد. اگر بررسیکننده دلایل شکست را گزارش میکند، لغو را جدا از خطای سوکت مدیریت کنید. آزادسازی کلاینت نیز مانع انباشته شدن سوکتها توسط بررسیهای تمامشده میشود.
کد قدیمیتر .NET Framework همهٔ overloadهای مدرن را ندارد. از یک ترتیب اتصال ناهمگام پشتیبانیشده استفاده کنید و هنگام رها کردن تلاش، سوکت را صریحاً ببندید. صرف توقف انتظار شما ثابت نمیکند که یک عملیات زیرین متوقف شده است.
نتیجهٔ سبز هنوز نتیجهٔ کوچکی است
یک اتصال TCP موفق ثابت میکند که این کلاینت به یک نقطهٔ پایانی شنونده رسیده است. اما SOCKS را مذاکره نکرده، به پروکسی HTTP احراز هویت نکرده، CONNECT را باز نکرده و پاسخ موردنظر وبسایت را دریافت نکرده است.
به آن مراحل بعدی رسیدگی محدود خودشان را بدهید، یا یک مهلت کلی آگاهانه را از میان آنها بگذرانید. در غیر این صورت تایمر اتصال تعمیرشده ممکن است بینقص کار کند در حالی که بررسیکننده دقیقهٔ دیگری را در انتظار handshake پروکسی میگذراند.