C# OpenVPN абал байкоочу: сессияны караңыз, желілік картаны эмес
NetworkAvailabilityChanged — VPN окуясы эмес. Туннелге ээ клиенттин абал агымын окуңуз, эскирген текшерүүлөрдөн коргоныңуз жана ар бир туташуу боюнча даярдыкты жарыялаңыз.
Туннел өлүп жатканда да колдонмоңуз иштеп жатат. Wi-Fi дагы эле күйүк, интернет дагы эле жооп берет, ал эми колдонмо көз каранды болгон жеке API жеткиликсиз болуп калды. Адамдар бул жерде адатта кайрылган .NET окуясы, NetworkAvailabilityChanged, бул кырдаалды такыр сүрөттөбөйт. Ал машинанын жалпы абалынын өзгөрүшүн билдирет жана бул абал VPN ажырап, кайра туташканда дагы чын бойдон кала алат. Байкоочу туннелге ээ клиентти кароого тийиш, тармак стектин анын жөнүндөгү корутундусун эмес.
Жеткиликтүүлүк — жалпы чоңдук, сиздин туннелиңиз эмес
NetworkAvailabilityChanged машинанын жалпы жеткиликтүүлүк жообу өзгөргөндө ишке кирет жана ал жооп loopback же туннелден башка бардык активдүү интерфейсти эсептейт.
Wi-Fi күйүк турганда VPN кулашы ал өлчөгөн нерселердин эч бирин өзгөртпөйт, ошондуктан окуя сизди тынчсыздандырган так ошол бузулуу учурунда үнсүз кала алат.
Абал агымы туннелге ээ клиентке таандык
Кайсы компонент туташууга ээ экенин аныктаңыз: OpenVPN GUI же кызматы, OpenVPN Connect, же колдонмоңуз ишке киргизип, башкарган процесс. Булар ар кандай колдоого алынган интерфейстери бар ар башка ээлер жана байкоочу жайгаштырууга ылайыктуусун колдонууга тийиш. Сизге интеграциялоого уруксат берилген OpenVPN процесси үчүн башкаруу интерфейси учурдагы абалды, тарыхты жана реалдуу убакыттагы эскертүүлөрдү билдирет. Локалдаштырылган GUI жазуусунан connected сөзүн издоонун ордуна документтелген структуралдык билдирүүлөрдү талдаңыз.
Башкаруу каналы — артыкчылыктуу башкаруу бети, ошондуктан жаңы угуучу ачпаңыз жана GUI менен ал ээ болгон канал үчүн талашпаңыз.
Муун коргоочулары эскирген жыйынтыктарды токтотот
Ар бир байкоо белгилүү бир туташуу аракетине таандык. Жаңы аракет башталганда, канал жоголгондо жана клиент чыгууну билдиргенде муун эсептегичин көбөйтүңүз.
A туташуусу учурунда башталган текшерүүнү карап көрөлү. Туннел кулайт, B туташуусу башталат, анан A-нын кечиктирилген HTTP ийгилиги келет. Коргоочусуз ал эски жыйынтык B дагы аутентификациядан өтүп жатканда дисплейди жашыл кылат. Жокко чыгаруу бош жумушту азайтат, ал эми муун текшерүүсү эскирген бүтүүнүн учурдагы абалга айланышына жол бербейт:
var generation = _generation;
var reachable = await ProbeAsync(token);
if (generation != _generation) return;
Publish(reachable);
UI жиберилишинин айланасында да ушул эрежени колдонуңуз, анткени маршалданган жаңыртуу муун илгерилегенден кийин келиши мүмкүн.
Инициализация жана кайра туташуу — бир жашоо циклы
Биринчи туташууну, кайра туташууну жана каналдын жоголушун бир эрежелер топтому менен бир жашоо циклы катары караңыз:
- Интерфейс уруксат берген жерде учурдагы абалды окуп, эскертүүлөргө бир кадамда жазылыңыз.
- Ар бир байкоону туташуу идентификатору жана муун менен белгилеңиз.
- Кайра туташууда, чыгууда же жоголгон байкоо каналында даярдыкты жараксыз кылыңыз.
- Жеке ресурсту ээси инициализация бүткөнүн билдиргенден кийин гана текшериңиз.
- Учурдагы муунга дагы таандык жыйынтыктарды гана жарыялаңыз.
Жоголгон канал — белгисиз, ажыратылган эмес. Белгисизди билдирүү далилдей албаган ажыратууну билдирүүдөн чынчыл жана кайра аракет логикасынын божомолго таянышына жол бербейт.
Далилдерди билдириңиз, логикалык маанини эмес
Аталган сессия абалын жана ресурс даярдыгын өзүнчө маанилер катары кайтарыңыз, ар бири жашы менен. Бир нерсени чечиши керек керектөөчү акыркы ийгиликтүү текшерүүнүн кырк секунд жашта экенин көрө алат, бул жаңы маалыматтан башка маалымат.
Ачык IP издеө жеке API талап кылынган маршрутту колдонгонунун далили эмес, ошондуктан аны ошондой кылып көрсөтпөңүз.
Аткарууну байкоочунун сыртында кармаңыз
Кайтарым чакыруу фактыдан кийин иштейт. Ал окуя менен иштетүүчүнүн ортосунда машинадан бир да пакет чыкпаганына кепилдик бере албайт. Эгер дизайн бөгөттөөнү талап кылса, аны тармактык саясат камсыз кылышы керек, ал эми байкоочунун милдети — далилдерди чакырганга түшүндүрүү. Экөөнү аралаштыруу логикалык маанини кармаганы үчүн өзүн фаервол деп эсептеген кодду жаратат. Аткаруу катмарын кызыксыз жана текшерүүгө ылайыктуу кармаңыз, ал эми байкоочу окуучу бойдон калсын.
Анда UI суроосу жөнөкөй болуп калат: белгилүү нерсени жашы менен көрсөтүңүз жана белгисиз болсо, белгисиз деп айтыңыз.