Socket.SendTimeout-ը չի սահմանափակում պրոքսիի միացման փորձը
Սահմանափակեք պրոքսիի պորտի ստուգումը միացման հաստատման պահին՝ փոխարենը չսահմանելով timeout, որը վերաբերում է միայն տվյալների ուղարկմանը։
Պրոքսիի ստուգիչը սահմանում է SendTimeout = 200, կանչում է Connect և սպասում է շատ ավելի երկար, քան սպասվում էր։ Timeout-ը կապված է գործողության հետ, որին ստուգիչը դեռ չի հասել։
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 մեթոդին, պրոքսիի հոսթն ու պորտը տալիս է կանչողը. հանրային թեկնածուն պրոքսիների ցանկից կարող է տալ այդ երկու մուտքերը։ Եթե ստուգիչը հաղորդում է ձախողման պատճառները, չեղարկումը մշակեք socket-ի սխալից առանձին։ Կլիենտի ազատումը նաև թույլ չի տալիս ավարտված ստուգումներին կուտակել socket-ներ։
Հին .NET Framework կոդը չունի բոլոր ժամանակակից overload-ները։ Օգտագործեք աջակցվող ասինխրոն միացման կարգավորում և փորձից հրաժարվելիս բացահայտ փակեք socket-ը։ Միայն ձեր սպասումը դադարեցնելը չի ապացուցում, որ հիմքում ընկած գործողությունը դադարել է։
Կանաչ արդյունքը դեռ փոքր արդյունք է
Հաջող TCP միացումը ապացուցում է, որ այս կլիենտը հասել է լսող վերջնակետի։ Այն չի բանակցել SOCKS-ի շուրջ, չի նույնականացել HTTP պրոքսիի մոտ, չի բացել CONNECT և չի ստացել ցանկալի կայքի պատասխանը։
Այդ հետագա փուլերին տվեք իրենց սեփական սահմանափակ մշակումը, կամ դրանց միջով անցկացրեք դիտավորյալ ընդհանուր վերջնաժամկետ։ Հակառակ դեպքում վերանորոգված միացման ժամաչափը կարող է կատարյալ աշխատել, մինչ ստուգիչը ևս մեկ րոպե է ծախսում պրոքսիի handshake-ի սպասելիս։