Forritið þitt heldur áfram að virka meðan göngin deyja. Wi-Fi er enn í gangi, internetið svarar enn, og einkaaðgangsforritið sem forritið treystir á er orðið óaðgengilegt. .NET-atburðurinn sem fólk grípur venjulega til hér, NetworkAvailabilityChanged, lýsir þeirri stöðu alls ekki. Hann tilkynnir breytingu á heildarstöðu vélarinnar, og sú staða getur verið sönn í gegnum aftengingu og endurtengingu VPN. Athugari verður að fylgjast með skjáborðinu sem á göngin, ekki samantekt netstafsins.

Framboð er heildartala, ekki göngin þín

NetworkAvailabilityChanged kviknar þegar heildarframboðssvar vélarinnar breytist, og það svar telur hvert virkt viðmót nema loopback eða göng.

VPN-fall meðan Wi-Fi er í gangi breytir engu af því sem það mælir, þess vegna getur atburðurinn verið þögull einmitt meðan á þeirri bilun stendur sem þér er amt um.

Stöðustraumurinn tilheyrir skjáborðinu sem á göngin

Greindu hvaða eining á tenginguna: OpenVPN GUI eða þjónustan, OpenVPN Connect, eða ferli sem forritið þitt ræsti og stjórnar. Þetta eru ólíkir eigendur með ólík studd viðmót, og athugarinn verður að nota það sem passar við uppsetninguna. Fyrir OpenVPN-ferli sem þú hefur heimild til að tengjast, tilkynnir stjórnviðmótið núverandi stöðu, sögu og rauntímatilkynningar. Greindu skjalfestu skipulögðu skilaboðin í stað þess að leita að orðinu connected í staðfærðum GUI-texta.

Stjórnrásin er forréttindastýrihúð, svo ekki opna nýjan hlustanda og ekki berjast við GUI vegna rásar sem hún hefur þegar.

Kynslóðarvörður stöðva úreltar niðurstöður

Hver athugun tilheyrir ákveðinni tengingartilraun. Hækkaðu kynslóðarteljara þegar ný tilraun hefst, þegar rásin tapast og þegar skjáborðið tilkynnir útgöngu.

Hugleiddu prófun sem hófst meðan á tengingu A stóð. Göngin falla, tenging B hefst, og síðan kemur seinkaður HTTP-árangur A. Án varðar gerir það gamla útkoma skjáinn grænan meðan B er enn að sannreyna. Afpöntun dregur úr sóun vinnu, og kynslóðaprófunin er það sem kemur í veg fyrir að úrelt lok verði núverandi staða:

var generation = _generation;
var reachable = await ProbeAsync(token);
if (generation != _generation) return;
Publish(reachable);

Beittu sömu reglu í kringum sendingu til UI, því marshalaða uppfærslan getur komið eftir að kynslóðin hefur færst áfram.

Upphleðsla og endurtenging er einn lífsferill

Meðhöndlaðu fyrstu tengingu, endurtengingu og rastap tap sem einn lífsferil með einu setti af reglum:

  • Lestu núverandi stöðu og gerðu áskrift að tilkynningum í einu skrefi þar sem viðmótið leyfir.
  • Merktu hverja athugun með auðkenni tengingarinnar og kynslóðinni.
  • Ógildi reiðubúnað við endurtengingu, útgöngu eða tapaða athugunarrás.
  • Prófaðu einkaaðganginn aðeins eftir að eigandinn tilkynnir að upphleðslu sé lokið.
  • Birtu aðeins niðurstöður sem enn tilheyra núverandi kynslóð.

Tapað rás þýðir óþekkt, ekki aftengt. Að tilkynna óþekkt er heiðarlegra en að tilkynna aftengingu sem þú getur ekki sannað, og það kemur í veg fyrir að endurprófunarlógíkin bregðist við ágiskun.

Tilkynntu sönnunargögn, ekki boolean

Skilaðu nafngreindu lotuástandi og reiðubúnaði auðlindarinnar sem aðskildum gildum, hvert með aldri. Neytandi sem þarf að ákveða eitthvað getur þá séð að síðasta heppnaða prófun er fjörutíu sekúndna gömul, sem er önnur upplýsing en fersk.

Leit að opinberu IP-tölu er ekki sönnun þess að einkaaðgangsforrit hafi notað tilskilda leið, svo ekki kynna það eins og svo sé.

Haltu framfylgdinni utan við athugarann

Afturkall keyrir eftir á. Það getur ekki tryggt að ekkert pakki hafi yfirgefið vélina milli atburðarins og meðferðarans. Ef hönnunin krefst læsingar verður netstefnan að veita hana, og hlutverk athugarans er að útskýra sönnunargögnin fyrir kallaranum. Að blanda þessu tvennu framleiðir kóða sem heldur að hann sé eldveggur af því hann heldur boolean. Haltu framfylgdarlaginu leiðinlegu og prófanlegu, og láttu athugarann vera lesanda.

Þá verður UI-spurningin einföld: sýndu það sem er þekkt, með aldri þess, og segðu óþekkt þegar svo er.

Tengdir greinar