C# OpenVPN ಸ್ಥಿತಿ ವೀಕ್ಷಕ: ಸೆಶನ್ ಅನ್ನು ನೋಡಿ, NIC ಅನ್ನಲ್ಲ
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 ಪ್ರಶ್ನೆ ಸರಳವಾಗುತ್ತದೆ: ತಿಳಿದಿರುವುದನ್ನು ಅದರ ವಯಸ್ಸಿನೊಂದಿಗೆ ತೋರಿಸಿ, ಮತ್ತು ಅಜ್ಞಾತವಾದಾಗ ಅಜ್ಞಾತ ಎಂದು ಹೇಳಿ.