C# OpenVPN holat kuzatuvchisi: sessiyani kuzating, tarmoq kartasini emas
NetworkAvailabilityChanged VPN hodisasi emas. Tunnelga egalik qiluvchi klientning holat oqimini o'qing, eskirgan tekshiruvlardan saqlaning va har bir ulanish uchun tayyorlikni e'lon qiling.
Tunnel o'layotganda ham ilovangiz ishlashda davom etadi. Wi-Fi hali yoniq, internet hali javob bermoqda, va ilova tayanadigan xususiy API yetib bo'lmaydigan bo'ldi. Odamlar bu yerda odatda murojaat qiladigan .NET hodisasi, NetworkAvailabilityChanged, bu holatni umuman tasvirlamaydi. U mashinaning umumiy holatidagi o'zgarishni xabar qiladi va bu holat VPN uzilib, qayta ulanganda ham to'g'ri bo'lib qolishi mumkin. Kuzatuvchi tunnelga egalik qiluvchi klientni kuzatishi kerak, tarmoq stekining u haqidagi xulosasini emas.
Mavjudlik umumiy kattalik, sizning tunnelingiz emas
NetworkAvailabilityChanged mashinaning umumiy mavjudlik javobi o'zgarganda ishga tushadi va bu javob loopback yoki tunneldan boshqa har qanday faol interfeysni hisoblaydi.
Wi-Fi yoniq turganda VPN uzilishi u o'lchaydigan narsalardan hech narsani o'zgartirmaydi, shuning uchun hodisa sizni qiziqtirgan aynan o'sha nosozlik paytida jim turishi mumkin.
Holat oqimi tunnelga egalik qiluvchi klientga tegishli
Qaysi komponent ulanishga egalik qilishini aniqlang: OpenVPN GUI yoki xizmati, OpenVPN Connect, yoki ilovangiz ishga tushirgan va boshqaradigan jarayon. Bular turli qo'llab-quvvatlanadigan interfeyslarga ega turli egalardir va kuzatuvchi joylashuvga mos keladiganini ishlatishi kerak. Siz integratsiyalashga ruxsat olgan OpenVPN jarayoni uchun boshqaruv interfeysi joriy holat, tarix va real vaqt bildirishnomalarini xabar qiladi. Mahalliylashtirilgan GUI sarlavhasida connected so'zini qidirish o'rniga hujjatlashtirilgan tuzilgan xabarlarni tahlil qiling.
Boshqaruv kanali imtiyozli boshqaruv yuzasi, shuning uchun yangi tinglovchi ochmang va GUI allaqachon egallagan kanal uchun u bilan talashmang.
Avlod qo'riqchilari eskirgan natijalarni to'xtatadi
Har bir kuzatuv muayyan ulanish urinishiga tegishli. Yangi urinish boshlanganda, kanal yo'qolganda va klient chiqishni xabar qilganda avlod hisoblagichini oshiring.
A ulanishi paytida boshlangan tekshiruvni ko'rib chiqing. Tunnel yiqiladi, B ulanishi boshlanadi, keyin A ning kechikkan HTTP muvaffaqiyati keladi. Qo'riqchisiz o'sha eski natija B hali autentifikatsiyadan o'tayotganda ekranni yashil qiladi. Bekor qilish behuda ishni kamaytiradi va avlod tekshiruvi eskirgan tugallanishning joriy holatga aylanishiga yo'l qo'ymaydi:
var generation = _generation;
var reachable = await ProbeAsync(token);
if (generation != _generation) return;
Publish(reachable);
Xuddi shu qoidani UI yuborilishi atrofida qo'llang, chunki marshallangan yangilanish avlod oldinga o'tgandan keyin ham kelishi mumkin.
Ishga tushirish va qayta ulanish bitta hayot aylanishi
Birinchi ulanish, qayta ulanish va kanal yo'qolishini bitta qoidalar to'plamiga ega bitta hayot aylanishi deb qarang:
- Interfeys ruxsat bergan joyda bitta qadamda joriy holatni o'qing va bildirishnomalarga obuna bo'ling.
- Har bir kuzatuvni ulanish identifikatori va avlod bilan belgilang.
- Qayta ulanish, chiqish yoki yo'qolgan kuzatuv kanalida tayyorlikni bekor qiling.
- Xususiy resursni faqat egasi ishga tushirish tugaganini xabar qilgandan keyin tekshiring.
- Faqat joriy avlodga hali tegishli natijalarni e'lon qiling.
Yo'qolgan kanal noma'lum degani, uzilgan emas. Noma'lumligini xabar qilish isbotlay olmaydigan uzilishni xabar qilishdan ko'ra halolroq va qayta urinish mantiqining taxminga asoslanishiga yo'l qo'ymaydi.
Dalillarni xabar qiling, boolean emas
Nomlangan sessiya holati va resurs tayyorligini alohida qiymatlar sifatida qaytaring, har birida yosh bo'lsin. Biror narsani hal qilishi kerak bo'lgan iste'molchi oxirgi muvaffaqiyatli tekshiruvning qirq soniya yoshdaligini ko'rishi mumkin, bu yangi ma'lumotdan boshqacha ma'lumot.
Ommaviy IP qidiruvi xususiy API talab qilingan marshrutni ishlatganining dalili emas, shuning uchun uni shunday ko'rsatmang.
Ijroni kuzatuvchidan tashqarida saqlang
Callback voqeadan keyin ishlaydi. Voqea va ishlov beruvchi o'rtasida mashinadan birorta paket chiqmaganiga kafolat bera olmaydi. Agar dizayn bloklashni talab qilsa, uni tarmoq siyosati ta'minlashi kerak va kuzatuvchining vazifasi dalillarni o'z chaqiruvchisiga tushuntirishdir. Ikkalasini aralashtirish boolean saqlagani uchun o'zini xavfsizlik devori deb hisoblaydigan kod yaratadi. Ijro qatlamini zerikarli va sinovdan o'tkaziladigan saqlang, kuzatuvchi esa o'quvchi bo'lib qolsin.
Shunda UI savoli oddiy bo'ladi: ma'lum bo'lgan narsani yoshi bilan ko'rsating va noma'lum bo'lsa, noma'lum deb ayting.