C# OpenVPN-steatoersjoch: hâld de sesje yn 'e gaten, net de netwurkkaart
NetworkAvailabilityChanged is gjin VPN-evenemint. Lês de steatstream fan 'e eigener-client, beskermje tsjin ferâldere probes en publisearje reeheid per ferbining.
Jo applikaasje bliuwt wurkjen wylst de tunnel stjert. Wi-Fi is noch oan, it ynternet antwurdet noch, en de partikuliere API dêr't de app fan ôfhinklik is, is ûnberikber wurden. It .NET-evenemint dêr't minsken hjir normaal nei gripe, NetworkAvailabilityChanged, beskriuwt dy situaasje hielendal net. It meldt in feroaring yn 'e gearstalde tastân fan 'e masine, en dy tastân kin wier bliuwe by in VPN-ûntkoppeling en -werferbining. In waarnimmer moat de client folgje dy't de tunnel besit, net de gearfetting fan 'e netwurksteapel.
Beskikberens is in gearstalling, net jo tunnel
NetworkAvailabilityChanged wurdt aktivearre as it gearstalde beskikberensantwurd fan 'e masine feroaret, en dat antwurd telt elk oan-fêst interface útsein loopback of in tunnel.
In VPN-ûnderbrekking wylst Wi-Fi oan is, feroaret neat fan wat it mjit, dêrom kin it evenemint stil bliuwe ûnder krekt de flater dy't jo oanbelanget.
De steatstream heart by de client dy't de tunnel besit
Bepale hokker komponint de ferbining besit: de OpenVPN GUI of -tsjinst, OpenVPN Connect, of in proses dat jo applikaasje start en kontrolearret. Dat binne ferskate eigeners mei ferskate stipe interfaces, en de waarnimmer moat dy brûke dy't by de útrôl past. Foar in OpenVPN-proses dêr't jo foech hawwe om mei te yntegrearjen, rapportearret de behearinterface de hjoeddeiske tastân, in skiednis en realtime notifikaasjes. Analyzearje de dokumintearre strukturearre berjochten ynstee fan yn in lokalisearre GUI-opschrift te sykjen nei it wurd connected.
It behearkanaal is in privilegiearre bestjoeringsoerflak, dus iepenje gjin nije listener en fjochtsje net mei de GUI om in kanaal dat hy al hat.
Generaasjewachten stopje ferâldere resultaten
Elke waarnimming heart by in spesifike ferbiningspoging. Ferheegje in generaasjeteller as in nije poging begjint, as it kanaal ferlern giet en as de client ôfsluting meldt.
Tink oan in probe dy't begûn yn ferbining A. De tunnel falt fuort, ferbining B begjint, en dêrnei komt A syn fertrage HTTP-sukses oan. Sûnder wacht makket dat âlde resultaat it byld grien wylst B noch autentisearret. Annulearring ferminderet ferspile wurk, en de generaasjekontrôle is wat foarkomt dat in ferâldere foltôging de hjoeddeiske tastân wurdt:
var generation = _generation;
var reachable = await ProbeAsync(token);
if (generation != _generation) return;
Publish(reachable);
Pas deselde regel ta om 'e UI-ferstjoering, want de marshalled fernijing kin oankomme neidat de generaasje fierder gien is.
Inisjalisaasje en werferbining binne ien libbenssyklus
Behannelje earste ferbining, werferbining en kanaalferlies as ien libbenssyklus mei ien set regels:
- Lês de hjoeddeiske tastân en abonnearje op notifikaasjes yn ien stap wêr't de interface it talit.
- Befestigje elke waarnimming mei de identiteit fan 'e ferbining en de generaasje.
- Meitsje reeheid ûnjildich by werferbining, ôfsluting of in ferlern waarnimmingskanaal.
- Probearje it partikuliere boarne pas neidat de eigener meldt dat de inisjalisaasje klear is.
- Publisearje allinnich resultaten dy't noch by de hjoeddeiske generaasje hearre.
In ferlern kanaal betsjut ûnbekend, net ûntkoppele. Ûnbekend melde is earliker as in ûntkoppeling melde dy't jo net bewize kinne, en it stopet de werbesyklogika om op in gissing te hanneljen.
Rapportearje bewiis, gjin boolean
Jou de neamde sesjestastân en de boarnereeheid werom as aparte wearden, elk mei in âldens. In konsumint dat eat beslute moat, kin dan sjen dat de lêste slagge probe fjirtich sekonden âld is, wat oare ynformaasje is as in farske.
In syktocht nei iepenbiere IP is gjin bewiis dat in partikuliere API de fereaske rûte brûkt hat, dus presintearje it net as wie it sa.
Hâld hantearing bûten de waarnimmer
In callback rint efter de ein. It kin net garandearje dat der tusken it evenemint en de handler gjin pakket de masine ferlitten hat. As it ûntwerp blokkearjen fereasket, moat it netwurkbelied dat leverje, en de taak fan 'e waarnimmer is it bewiis oan syn oanropper te ferklearjen. It mingjen fan beide produsearret koade dy't tinkt dat it in firewall is om't it in boolean hat. Hâld de hantearingslaach saai en testber, en lit de waarnimmer in lêzer bliuwe.
Dan wurdt de UI-fraach ienfâldich: lit sjen wat bekend is, mei syn âldens, en sis ûnbekend as it sa is.