ورود

View Full Version : سوال: چک کردن اینترنت در اکسس



rostamani68
جمعه 06 فروردین 1400, 00:10 صبح
سلام
ایا میشه قبل لود شدن فرم اصلی برنامه چک کنه که اینترنت متصل هست یا نه
اگر متصل بود فرم باز بشه ؟؟؟؟؟؟؟؟؟؟

Shahramdindoust
جمعه 06 فروردین 1400, 10:46 صبح
خودم امتحان نکردم ولی یه کد رو مینویسم شما امتحان کن
1- اول فایل اکسست رو باز کن سپس با زدن alt+f11برو تو محیط کد نویسی فایل اکسس
2- در رویداد on open
Private Sub Form_Open(Cancel As Integer)
Me.TimerInterval = 1000
End Sub
2- سپس در رویداد on timer
Private Sub Form_Timer()
Dim rst As DAO.Recordset
Dim strConnection As String
If InternetGetConnectedState(0&, 0&) Then
strConnection = "اینترنت وصل است"
Else

strConnection = "اینترنت وصل نیست بنابراین از برنامه خارج می شوید"
docmd.quit
End If

امتحان ببین مشکل داره یا نه من هم این کد رو یه جایی دیدم خودم استفاده نکردم

rostamani68
جمعه 06 فروردین 1400, 12:10 عصر
انجام دادم نشد .کسی نظری نداره:افسرده:

rostamani68
یک شنبه 08 فروردین 1400, 00:15 صبح
کسی بلد نیست؟؟

Shahramdindoust
یک شنبه 08 فروردین 1400, 11:11 صبح
سلام کدها رو اصلاح کردم دوباره امتحان کن
اول یه ماژول بساز با و ذخیره کن و این کد ها رو توش بنویس



Option Compare Database
Public Declare Function InternetGetConnectedState Lib "wininet.dll" _
(ByRef dwflags As Long, ByVal dwReserved As Long) As Long




بعد این کد ها رو توی محیط کدنویسی فرم خودت (نه توی ماژول) کپی کن کار میکنه





Private Sub Form_Open(Cancel As Integer)
Me.TimerInterval = 2000
End Sub




Private Sub Form_Timer()
Dim rst As DAO.Recordset




Dim strConnection As String
If InternetGetConnectedState(0&, 0&) Then
strConnection = "Is connected"
Else
strConnection = "Not connected"
DoCmd.quit
End If
End Sub


موفق باشید
اگه مشکلی بود بگین

amirzazadeh
یک شنبه 08 فروردین 1400, 11:15 صبح
سلام
سئوالتون خیلی کلی مطرح شده با این وجود چیزی که مشخصه کدهای شما باید در رویداد لود فرم اجرا بشه و ساده ترین راه اینه که بعد از ارسال درخواست اگر موفق نبود با نشان دادن پیام مناسب و بستن فرم از برنامه خارج بشه.
..................
موفق باشید

rostamani68
یک شنبه 08 فروردین 1400, 17:16 عصر
مرسی تونستم با این کدی که دادین مشکلمو حل کنم با یکم تغییرات کوچیک
برای دوستامی که مثل من مشکل داشتن
یک ماژول بسازید و کد زیر را تو ماژول کپی کردم

Public Declare Function InternetGetConnectedState Lib "wininet.dll" _
(ByRef dwflags As Long, ByVal dwReserved As Long) As Long


نکته : دوستانی که نسخه 64 بیتی رو دارند .قبل از نوشته Function عبارت PtrSafe رو اضافه کنید . تا مشکل برطرف بشه .که کد از رنگ قرمز در بیاد

بعد تو قسمت انلود تایمر on Timer صفحه اصلی برنامه کد زیر را کپی کنید





Dim rst As DAO.Recordset





If InternetGetConnectedState(0&, 0&) Then

Me.lblnet.Caption = "اینترنت انلاین"
Else

Me.lblnet.Caption = "اینترنت افلاین"

End If


بعد توی کادر پاین timer TimerInterval بنویسید 2000
نکته : تو صفحه اصلی یه lbl لیبل بسازید و نام lbl لیبل رو بزارید lblnet

:قلب:

Shahramdindoust
یک شنبه 08 فروردین 1400, 20:23 عصر
مرسی تونستم با این کدی که دادین مشکلمو حل کنم با یکم تغییرات کوچیک


:قلب:

تو سوالتون در پست شماره 1 مطرح کردین که "اگر نت وصل بود فرم باز بشه؟؟؟" اگه منظورتون اینه که اگه نت وصل نبود باز نشه از کد


docmd.close
یا
docmd.quit
هم باید استفاده کنید

rostamani68
دوشنبه 09 فروردین 1400, 00:58 صبح
بله ممنون از راهنماییتون

mazoolagh
شنبه 14 فروردین 1400, 11:45 صبح
قبل از اینکه کدهای آماده در اینترنت رو اسفاده کنین، باید مستندات اون رو بخونین بخصوص توابع API .
این تابع InternetGetConnectedState که اینجا استفاده شده مطلقا و به هیچ وجه برای بررسی وضعیت وصل بودن اینترنت قابل استفاده نیست و اصولا کارش این نیست!
خیلی راحت این تابع وقتی اینترنت قطع هست مقدار TRUE برمیگردونه که این رو میگذارم خودتون تحقیق کنین چرا اینجور هست.

جواب درست همونی بود که در پست شماره 6 آمده:
1- مشخص نیست که منظور از وصل بودن اینترنت دقیقا چی هست؟ آیا یک سایت یا سرویس مشخص مورد نظر هست (منطقیش اینه) و یا بطور کلی.
2- وضعیت اینترنت لحظه ای هست یعنی اگر فرض کنیم به روشی بتونیم وضعیت شبکه رو پیدا کنیم، اعتبارش در همون لحظه است و نه حتی یک ثانیه بعدش.
برای همین باید در همون روتین که قرار هست با اینترنت سروکار داشته باشه، با کنترل پاسخ و بررسی وضعیت خطا برنامه رو مدیریت کنیم.

Shahramdindoust
یک شنبه 15 فروردین 1400, 10:47 صبح
قبل از اینکه کدهای آماده در اینترنت رو اسفاده کنین، باید مستندات اون رو بخونین بخصوص توابع API .
این تابع InternetGetConnectedState که اینجا استفاده شده مطلقا و به هیچ وجه برای بررسی وضعیت وصل بودن اینترنت قابل استفاده نیست و اصولا کارش این نیست!
خیلی راحت این تابع وقتی اینترنت قطع هست مقدار TRUE برمیگردونه که این رو میگذارم خودتون تحقیق کنین چرا اینجور هست.

جواب درست همونی بود که در پست شماره 6 آمده:
1- مشخص نیست که منظور از وصل بودن اینترنت دقیقا چی هست؟ آیا یک سایت یا سرویس مشخص مورد نظر هست (منطقیش اینه) و یا بطور کلی.
2- وضعیت اینترنت لحظه ای هست یعنی اگر فرض کنیم به روشی بتونیم وضعیت شبکه رو پیدا کنیم، اعتبارش در همون لحظه است و نه حتی یک ثانیه بعدش.
برای همین باید در همون روتین که قرار هست با اینترنت سروکار داشته باشه، با کنترل پاسخ و بررسی وضعیت خطا برنامه رو مدیریت کنیم.
----------------
البته در پست 6 نکته درستی هست ولی در رویداد لود توضیح داده شده اما من فکر کنم اگه قراره همیشه اتصال برقرار باشه شاید رویداد تایمر بهتر که کد رو بگذاریم اینجوری لحظه به لحظه هم اتصال یا عدم اتصال بررسی میشه و میشه اقدام مناسب رو برای کاربر با پیام توضیح داد

mazoolagh
یک شنبه 15 فروردین 1400, 13:50 عصر
----------------
البته در پست 6 نکته درستی هست ولی در رویداد لود توضیح داده شده اما من فکر کنم اگه قراره همیشه اتصال برقرار باشه شاید رویداد تایمر بهتر که کد رو بگذاریم اینجوری لحظه به لحظه هم اتصال یا عدم اتصال بررسی میشه و میشه اقدام مناسب رو برای کاربر با پیام توضیح داد

شما باز هم به مطلب نوشته شده دقت نکردین!
اصلا مهم نیست که شما این تابع رو چجوری قرار هست استفاده کنین - وضعیت وصل بودن اینترنت با این روش بدست نمیاد!
حتی با قطع بودن اینترنت هم مقدار TRUE برمیگردونه - تست کنین خودتون.

نکته اش رو گذاشتم خودتون مطالعه و تحقیق کنین.

محمد رضا بهبودی
دوشنبه 16 فروردین 1400, 07:45 صبح
با سلام و احترام
دوست عزیز در فایلی که پیوست کردم با کلیک بر روی دکمه می توانید هم وضعیت شبکه داخلی خود را کنترل کنید و هم وضعیت اتصال به اینترنت را چک کنید. اگر شبکه داخلی قطع باشد پیام جدا می دهد و اگر اینترنت قطع باشد پیام دیگیری میدهد . امیدوارم که مفید باشد

rostamani68
چهارشنبه 18 فروردین 1400, 21:41 عصر
با سلام و احترام
دوست عزیز در فایلی که پیوست کردم با کلیک بر روی دکمه می توانید هم وضعیت شبکه داخلی خود را کنترل کنید و هم وضعیت اتصال به اینترنت را چک کنید. اگر شبکه داخلی قطع باشد پیام جدا می دهد و اگر اینترنت قطع باشد پیام دیگیری میدهد . امیدوارم که مفید باشد

مرسی دوست عزیز شما با پی سی میایین براتون کار میکنه منی که با وای فا میاد کدش بید تغییر کنه وبه درد بخور بود مرسی
اگر برنامه مثل ای داری ممنون میشم برام بفرستی

rostamani68
چهارشنبه 18 فروردین 1400, 21:42 عصر
شما باز هم به مطلب نوشته شده دقت نکردین!
اصلا مهم نیست که شما این تابع رو چجوری قرار هست استفاده کنین - وضعیت وصل بودن اینترنت با این روش بدست نمیاد!
حتی با قطع بودن اینترنت هم مقدار TRUE برمیگردونه - تست کنین خودتون.

نکته اش رو گذاشتم خودتون مطالعه و تحقیق کنین.

من با همین روش دارم استفاده میکنم جواب میده .درسته از نظر علمی کارش این نیست ولی کار راه اندازه و مشکلمون رو برطرف میکنه

mazoolagh
پنج شنبه 19 فروردین 1400, 08:11 صبح
با سلام و احترام
دوست عزیز در فایلی که پیوست کردم با کلیک بر روی دکمه می توانید هم وضعیت شبکه داخلی خود را کنترل کنید و هم وضعیت اتصال به اینترنت را چک کنید. اگر شبکه داخلی قطع باشد پیام جدا می دهد و اگر اینترنت قطع باشد پیام دیگیری میدهد . امیدوارم که مفید باشد

لطفا کدهای برنامه رو در تگ code یا vb پست کنین تا بشه اون رو بررسی کرد.

محمد رضا بهبودی
پنج شنبه 19 فروردین 1400, 08:26 صبح
با سلام و احترام

Option Compare Database
Const NETWORK_ALIVE_AOL = &H4
Const NETWORK_ALIVE_LAN = &H1
Const NETWORK_ALIVE_WAN = &H2
Private Declare Function IsNetworkAlive Lib "SENSAPI.DLL" (ByRef lpdwFlags As Long) As Long


Private Sub Command0_Click()
Dim CRes As Long
If IsNetworkAlive(CRes) = 0 Then
"شبکه داخلی قطع است" MsgBox
Else
If CRes = NETWORK_ALIVE_LAN Then
"اینترنت قطع است" MsgBox
Else
"اینترنت وصل است" MsgBox
End If
End If
End Sub

mazoolagh
پنج شنبه 19 فروردین 1400, 08:32 صبح
من با همین روش دارم استفاده میکنم جواب میده .درسته از نظر علمی کارش این نیست ولی کار راه اندازه و مشکلمون رو برطرف میکنه
کد به تنهایی موردی نداره (به جز Dim rst As DAO.Recordset که از برنامه مبدا کپی شده و بدون هیچ دلیل و کاربردی هنوز حضور داره!)
این کد فقط نشون میده که شما امکان دسترسی به اینترنت رو دارین یا نه، این فرق میکنه با این که واقعا متصل هستین.
اگر اینترنت از isp و به بعد قطع باشه باز هم true برمیگردونه، شاید این برای شما اهمیت نداشته باشه ولی قطعا برای اینکار کد نادرستی هست!

گذشته از همه این موارد، خود ویندوز روی آیکون شبکه وضعیت اتصال به اینترنت رو هم نشون میده؛
به فرض محال که این کد درست کار میکنه چه نیازی هست که این رو در فرم هم نمایش بدیم.

و باز هم فرض کنیم که کد درست رو هم از یک جایی پیدا و کپی کردیم،
وقتی اعتبار وضعیت اتصال لحظه ای هست نمیشه از این روش برای تصمیم گیری در انجام کاری استفاده کرد.
در همون پست شماره 6 آمده این موضوع.

mazoolagh
پنج شنبه 19 فروردین 1400, 08:45 صبح
با سلام و احترام

Option Compare Database
Const NETWORK_ALIVE_AOL = &H4
Const NETWORK_ALIVE_LAN = &H1
Const NETWORK_ALIVE_WAN = &H2
Private Declare Function IsNetworkAlive Lib "SENSAPI.DLL" (ByRef lpdwFlags As Long) As Long


Private Sub Command0_Click()
Dim CRes As Long
If IsNetworkAlive(CRes) = 0 Then
"شبکه داخلی قطع است" MsgBox
Else
If CRes = NETWORK_ALIVE_LAN Then
"اینترنت قطع است" MsgBox
Else
"اینترنت وصل است" MsgBox
End If
End If
End Sub







سلام و روز خوش جناب بهبودی

این کد هم دقیقا همون مورد کد قبل رو داره؛
یعنی فقط میتونه تشخیص بده که شبکه up هست یا نه ولی در تشخیص وصل بودن اینترنت ناتوان هست.

محمد رضا بهبودی
پنج شنبه 19 فروردین 1400, 10:25 صبح
سلام و روز خوش جناب بهبودی

این کد هم دقیقا همون مورد کد قبل رو داره؛
یعنی فقط میتونه تشخیص بده که شبکه up هست یا نه ولی در تشخیص وصل بودن اینترنت ناتوان هست.
جناب مزولق روز خوش
این کد در سیستم من که به شبکه سازمانی متصل است به درستی کار می کند زمانی که کابل شبکه را از سیستم جدا می کنم پیغام اول صادر می شود و زمانی که از طریق برنامه ibsengin اینترنت را قطع می کنم پیام دوم ظاهر شده و زمانی که اینترنت را وصل می کنم پیام سوم ظاهر می شود .

mazoolagh
پنج شنبه 19 فروردین 1400, 12:04 عصر
جناب مزولق روز خوش
این کد در سیستم من که به شبکه سازمانی متصل است به درستی کار می کند زمانی که کابل شبکه را از سیستم جدا می کنم پیغام اول صادر می شود و زمانی که از طریق برنامه ibsengin اینترنت را قطع می کنم پیام دوم ظاهر شده و زمانی که اینترنت را وصل می کنم پیام سوم ظاهر می شود .

IBSNG برنامه ACCOUNTING هست و نمیدونم سازوکارش با اینترفیس شبکه هنگام قطع اینترنت چگونه هست ،
ولی شما یک تست ساده در خانه (یا هر جای دیگه که ADSL دارین) انجام بدین:
سیم تلفن رو از مودم قطع و این کد (یا کد آقای دیندوست) رو اجرا کنین و ببینین قطع بودن اینترنت رو تشخیص میده یا نه.

در تاپیک های مربوط به وب سرویس (تامین اجتماعی، بیمه سلامت، ارسال پیامک) اگر کدهایی رو که گذاشتم بررسی کنین روش کار مشخص شده،
با این وجود یک کد مستقل برای اینکار همینجا پیوست میکنم.

mazoolagh
پنج شنبه 19 فروردین 1400, 17:34 عصر
برای اطمینان از این که به سرویس اینترنت دسترسی داریم، باید یک درخواست به یک آدرس بفرستیم و جواب رو بررسی کنیم.

یک راه این هست که یک آدرس اینترنتی رو باز کنیم (بطور منطقی باید آدرس سایتی باشه که باهاش سروکار داریم)

کد زیر به ما کمک میکنه بدونیم آیا به یک آدرس مشخص دسترسی داریم یا نه،
و اگر دسترسی نداریم دلیل اون چی هست (در صورت نیاز)

mazoolagh
پنج شنبه 19 فروردین 1400, 17:35 عصر
Option Compare DatabaseOption Explicit


Public Type Response
OK As Boolean
StatusText As String
StatusCode As String
End Type


Function Check_Url(url As String) As Response
On Error GoTo Error_handler
Dim RQ As New WinHttpRequest
RQ.Open "Get", url, False
RQ.Send
Check_Url.OK = True
Check_Url.StatusText = RQ.StatusText
Check_Url.StatusCode = RQ.Status
Exit Function
Error_handler:
Check_Url.OK = False
Check_Url.StatusCode = Err.Number
Check_Url.StatusText = Err.Description
End Function

mazoolagh
پنج شنبه 19 فروردین 1400, 17:41 عصر
برای نمونه کد زیر رو در نظر بگیرین:
Dim r As Response
r = Check_Url("https://google.com")
Debug.Print r.OK, r.StatusCode, r.StatusText

خروجی بصورت زیر خواهد بود:

True 200 OK

mazoolagh
پنج شنبه 19 فروردین 1400, 17:45 عصر
ولی اگر آدرسی رو که در سایت وجود نداره بدیم:
Dim r As Response
r = Check_Url("https://google.com/aaaaaa")
Debug.Print r.OK, r.StatusCode, r.StatusText

نتیجه زیر رو داریم:

True 404 Not Found

mazoolagh
پنج شنبه 19 فروردین 1400, 18:01 عصر
راه دیگه این هست که یک هاست مشخص رو ping کنیم.
پینگ کردن یک هاست با چک کردن url فرق داره:
1- هر آدرس با هر سرویسی رو میشه پینگ کرد (البته بعضی سرورها به پینگ پاسخ نمیدن به دلایل کاملا مشخص!)
پس برخلاف چک url که فقط برای سرویس http معنی داره، میتونیم dns یا mail server و ... رو هم چک کنیم.
2- پینگ خیلی سریعتر هست چون یک پکت کوچک میفرسته و یک پاسخ کوچک هم میگیره ولی در چک url باید تمام پاسخ خونده بشه و این میتونه زمانبر باشه.

mazoolagh
پنج شنبه 19 فروردین 1400, 18:10 عصر
البته ping باید در command prompt یا power shell اجرا بشه:

153210

153211

153212

mazoolagh
پنج شنبه 19 فروردین 1400, 18:27 عصر
ولی ما به جای این که خروجی دستور رو در فایل بریزیم و اون رو پردازش کنیم از کلاس Win32_PingStatus استفاده میکنیم.
برای آشنایی با این کلاس میتونین به آدرس زیر برین:
https://docs.microsoft.com/en-us/previous-versions/windows/desktop/wmipicmp/win32-pingstatus

در همین آدرس یک نمونه کد هم هست که من اون رو ساده کردم:
Public Function Ping(Host As String) As Boolean
Dim objPing As Object
Set objPing = GetObject("winmgmts:").Get("Win32_PingStatus.Address='" & Host & "'")
Ping = (objPing.StatusCode = 0)
End Function

Shahramdindoust
شنبه 21 فروردین 1400, 09:45 صبح
----------------------------------

mazoolagh
شنبه 21 فروردین 1400, 13:52 عصر
(یا کد آقای ایراندوست)
----------------------------------
دین دوست هستم :لبخندساده:

شرمنده بابت بی دقتی
پست رو ویرایش کردم

محمد رضا بهبودی
دوشنبه 23 فروردین 1400, 08:15 صبح
با سلام و احترام
ضمن تشکر از راهنمائی های مفید استاد گرامی جناب مازولق
من در فایل پیوست از طریق گرفتن پینگ سایت گوگل می توانم اتصال به اینترنت و یا عدم اتصال را کنترل کنم . امیدوارم که مفید باشد

محمد رضا بهبودی
دوشنبه 23 فروردین 1400, 08:34 صبح
تعداد پک های ارسالی 1 و زمان ارسال 500 میلی ثانیه در نظر گرفته شده است . اگر تعداد پک ها را 3 و زمان ارسال را 1000 میلی ثانیه در نظر بگبرید ، دقت برنامه بیشتر خواهد شد.

mazoolagh
یک شنبه 29 فروردین 1400, 13:15 عصر
با سلام و احترام
ضمن تشکر از راهنمائی های مفید استاد گرامی جناب مازولق
من در فایل پیوست از طریق گرفتن پینگ سایت گوگل می توانم اتصال به اینترنت و یا عدم اتصال را کنترل کنم . امیدوارم که مفید باشد

سلام و روز خوش
پیوست کدها کار خیلی خوبی هست که بهتره همیشه انجام بشه؛ به این دلیل که در جستجو منظور میشه و دیگران بهتر میتونن به یک مطلب برسن.

در مورد پینگ دائم به یک سرور نکته ای هست که بهتره در نظر داشته باشین که ممکنه به عنوان یک عمل خرابکارانه دیده بشه و بعد از مدتی IP شما بسته بشه.