Kichunguzi cha hali ya OpenVPN kwa C#: fuatilia kipindi, si kadi ya mtandao
NetworkAvailabilityChanged si tukio la VPN. Soma mtiririko wa hali kutoka kwa mteja anayemiliki handaki, jilinde dhidi ya uchunguzi uliozeeka na chapisha utayari kwa kila muunganisho.
Programu yako inaendelea kufanya kazi wakati handaki inakufa. Wi-Fi bado iko juu, intaneti bado inajibu, na API ya faragha ambayo programu inategemea imekuwa isiyofikika. Tukio la .NET ambalo watu kawaida hukimbilia hapa, NetworkAvailabilityChanged, halielezi hali hiyo hata kidogo. Linaripoti mabadiliko katika hali ya jumla ya mashine, na hali hiyo inaweza kubaki kweli wakati wa kukatika na kuunganishwa upya kwa VPN. Kichunguzi lazima kifuatilie mteja anayemiliki handaki, si muhtasari wa tabaka la mtandao.
Upatikanaji ni jumla, si handaki yako
NetworkAvailabilityChanged huanza wakati jibu la jumla la upatikanaji wa mashine linabadilika, na jibu hilo linahesabu kiolesura chochote hai isipokuwa loopback au handaki.
Kuporomoka kwa VPN wakati Wi-Fi iko juu hakubadilishi chochote kinachopimwa, ndiyo sababu tukio linaweza kukaa kimya wakati halisi wa hitilafu unayojali.
Mtiririko wa hali ni wa mteja anayemiliki handaki
Tambua sehemu inayomiliki muunganisho: GUI au huduma ya OpenVPN, OpenVPN Connect, au mchakato ambao programu yako ilianza na inadhibiti. Hawa ni wamiliki tofauti wenye violesura vinavyotumika tofauti, na kichunguzi lazima kitumie kile kinacholingana na usambazaji. Kwa mchakato wa OpenVPN ambao umeidhinishwa kuunganishwa nao, kiolesura cha usimamizi kinaripoti hali ya sasa, historia na arifa za wakati halisi. Changanua jumbe zilizoandikwa zenye muundo badala ya kutafuta neno connected katika maelezo ya GUI yaliyotafsiriwa.
Kituo cha usimamizi ni uso wa udhibiti wenye upendeleo, kwa hivyo usifungue msikilizaji mpya na usigombane na GUI kwa kituo ambacho tayari kinacho.
Walindaji wa kizazi huzuia matokeo yaliyozeeka
Kila uchunguzi ni wa jaribio mahususi la muunganisho. Ongeza kihesabu cha kizazi jaribio jipya linapoanza, kituo kinapopotea na mteja anaporipoti kutoka.
Fikiria uchunguzi ulioanza wakati wa muunganisho A. Handaki huanguka, muunganisho B huanza, kisha mafanikio ya HTTP ya A yaliyochelewa yanafika. Bila mlindaji, matokeo hayo ya zamani hufanya onyesho kuwa kijani wakati B bado inathibitisha. Kughairi hupunguza kazi iliyopotea, na ukaguzi wa kizazi ndio huzuia ukamilishaji uliozeeka kuwa hali ya sasa:
var generation = _generation;
var reachable = await ProbeAsync(token);
if (generation != _generation) return;
Publish(reachable);
Tumia kanuni hiyo hiyo kuzunguka utumaji wa UI, kwa sababu sasisho lililowekwa marshalling linaweza kufika baada ya kizazi kusonga mbele.
Uanzishaji na kuunganishwa upya ni mzunguko mmoja wa maisha
Chukulia muunganisho wa kwanza, kuunganishwa upya na upotevu wa kituo kama mzunguko mmoja wa maisha wenye seti moja ya kanuni:
- Soma hali ya sasa na ujisajili kwa arifa katika hatua moja mahali ambapo kiolesura kinaruhusu.
- Weka alama kwa kila uchunguzi kwa utambulisho wa muunganisho na kizazi.
- Batilisha utayari wakati wa kuunganishwa upya, kutoka au kituo cha uchunguzi kilichopotea.
- Chunguza rasilimali ya faragha tu baada ya mmiliki kuripoti kwamba uanzishaji umekamilika.
- Chapisha tu matokeo ambayo bado ni ya kizazi cha sasa.
Kituo kilichopotea humaanisha haijulikani, si kimekatika. Kuripoti haijulikani ni mwaminifu zaidi kuliko kuripoti kukatika usikoweza kuthibitisha, na huzuia mantiki ya kujaribu tena kufanya kazi kwa dhana.
Ripoti ushahidi, si boolean
Rudisha hali ya kipindi iliyotajwa na utayari wa rasilimali kama thamani tofauti, kila moja ikiwa na umri. Mtumiaji anayepaswa kuamua kitu anaweza kuona kwamba uchunguzi wa mwisho uliofanikiwa una umri wa sekunde arobaini, ambayo ni taarifa tofauti na mpya.
Utafutaji wa IP ya umma si ushahidi kwamba API ya faragha ilitumia njia inayohitajika, kwa hivyo usiiwasilishe kana kwamba ni hivyo.
Weka utekelezaji nje ya kichunguzi
Callback hufanya kazi baada ya tukio. Haiwezi kuhakikisha kwamba hakuna pakiti iliyoondoka kwenye mashine kati ya tukio na mshughulikiaji. Ikiwa muundo unahitaji kuzuia, sera ya mtandao lazima itoe, na kazi ya kichunguzi ni kueleza ushahidi kwa mpigaji wake. Kuchanganya vyote viwili huzalisha msimbo unaodhani ni firewall kwa sababu unashikilia boolean. Weka tabaka la utekelezaji kuwa la kuchosha na linalojaribika, na kichunguzi kibaki msomaji.
Kisha swali la UI linakuwa rahisi: onyesha kile kinachojulikana, pamoja na umri wake, na sema haijulikani linapokuwa hivyo.