سلام جواد جان
. چند روز پيش به خاطر پست جديدي كه در تاپيك "
راهنماي تبديل تاريخ هاي شمسي، ..." داديد و به آنجا سري زدم متوجه لينكهاي برنامه در امضاشما شدم وقتي نگاه كردم ديدم همه كار شماست. ايــــــــــــــول
. يكي از آن برنامهها توجهام را جلب كرد، اونم برنامه اين تاپيك بود. علتش هم اين بود كه برنامهاي مشابه اين را خيلي وقت پيش (سال 2000) نوشته بودم. برام جالب بود ببينم همون مشكلاتي كه روزهاي اول من هم با اين برنامه داشتم آيا شما داريد يا آنها را حل نموديد.
. متاسفانه اولين مشكل يعني "
تشخيص دسترسي داشتن به اينترنت" و در پي آن "ا
رتباط از طريق چه كانكشن يا وسيلهاي" و در پي آن "
چه نوع ارتباطي" وجود داشت. دو مورد 2 و 3 شايد مهم نباشد، اما مورد 1 ، اگر به درستي اجرا نشود باعث اختلال در كار برنامه و در نتيجه اشتباه تشخيص دادن "دسترسي به اينترنت" ميشود.
. مشكل برنامه در اين است كه اگر يك كانكشن LAN موجود باشد، برنامه شما آن را به عنوان يك كانكشن اينترنتي فرض ميكند. به مجرد اينكه برنامه شما را اجرا كردم گفت: "شما از طريق كارت DVB به اينترنت وصل شدهايد!!!!" نميدانم از چه روشي براي تشخيص كانكشن استفاده نموديد اما زماني كه آمدم كارت DVB را Disable كنم، با پيغام خطا "اين كار ممكن نيست چون برنامهاي به آن دسترسي دارد" مواجه شدم. حتا با خروج از برنامه شما هم اين مشكل حل نشد. مجبور به Reset شدم و اينبار با LAN اين موضوع را تست كردم باز هم همان اشكال ايجاد شد. باز هم امكان Disable كردن نبود!!
. چون در اين زمينه 2 برنامه نوشته بودم و تجربه داشتم گفتم اولين راهنما در زمينه برنامه نويسي را به اين موضوع تخصيص دهم اما چون گرفتار نوشتن 2 راهنما توامن هستم گفتم به شكل خلاصه به شما اين نكته را عرض كنم و چون در برنامه نويسي حرفهاي هستيد، زياد نياز به توضيح نخواهد بود:
. اول اين نكته را بگويم اصطلاح "تشخيص دسترسي داشتن به اينترنت" خودش كلي حرف و حديث دارد، به طوري كه زماني كه داشتم در مورد اين موضوع تحقيق ميكرم، در يكي از سايتهاي انگليسي جمله فوق باعث بوجود آمدن يك بحث فلسفي!!!! شده بود كه اصلن جمله "ارتباط يا دسترسي به اينترنت داشتن" چه معني دارد و درست هست يا نه!! اما روش كد نويسي پيشنهادي من:
يك نكته: (كليه لينكها از MSDN همراه Visual Stedio 2005 هستند. احتمالن داري ديگه!؟ با كپي كرد آنها در آدرس بار MSDN به اصل مطلب ميرسيد. پس هيچ لينكي از اينترنت نيست اما در MSDN كه Online هست در سايت مايكروسافت بيابيد. در ضمن توابع API چون در Platform SDK هست بايد آن را نيز در MSDN نصب نموده باشيد.)
. متاسفانه و خوشبختانه!!! در VS.هاهميشه چندين راه براي انجام يك كار موجود است!! اما نتيجه تحقيقات من دو تابع API بود كه از زير خانواده توابع
WinINet ميباشند و ميتوانند به ما در اين زمينه كمك كنند. فايل WinINet.dl تقريبن براي انجام تمامي امور شبكه و اينترنت تابع دارد.(ليست اين توابه در لينك فوق كه به MSDN هست موجود است). اما اولين تابع مورد نياز ما به دوشكل موجود است، به نامهاي:
1) InternetGetConnectedState ه
2) InternetGetConnectedStateEx ه
. اگر با توابع API آشنايي داشته باشيد ميدانيد كه پسوند "Ex" به معني پارامترهاي بيشتر داشتن (امكانات بيشتر داشتن) يك تابع نسبت به هم نام خود و بدون اين پسوند ميباشد. پس من هم همان تابع دوم را توضيح ميدهم.
. تابع
InternetGetConnectedStateEx امكان تشخيص Connection را دارد. مثل كانكشن LAN يا Modem يا Proxy و ... اما امكان تشخيص اينكه "
آيا امكان دسترسي به اينترنت از طريق اين كانكشن وجود دارد يا نه؟" را ندارد . براي حل اين مشكل يك كلك مرغابي وجود دارد كه اكثر برنامههاي خفن هم از آن استفاده ميكنند، Ping كردن يك سايت يا IP در اينترنت. اگر جواب Ping آمد پس ما به اينترنت دسترسي داريم. اين روش اشكالات خاص خودش را دارد كه در اين مطلب خلاصه آن را فاكتر ميگيرم.
. تابع دوم براي تشخيص دسترسي داشتن به اينترنت تابعي از همان فايل WinINet.dll هست با نام:
1) InternetCheckConnection ه
. با مشخص كردن آدرس يك سايت در تابع
InternetCheckConnection، اين تابع در صورتي كه امكان دسترسي به سايتي كه آدرس آن را به اين تابع ارسال نموديم، امكان پذير باشد، مقدار True را باز ميگرداند. من نميدانم شما از VB استفاده ميكنيد يا C اما در زير توضيحات توابع فوق در كد نويسي VB را نوشتهام و در انتها كد Classي كه براي يكي از برنامههام نوشته بودم را براي تكميل توضيحاتام براي شما قرار دادهام.
. Syntax تابع
InternetGetConnectedStateEx و تعريف آن در VB به شكل زير است:
کد:
Syntax=
BOOL InternetGetConnectedStateEx(
LPDWORD lpdwFlags,
LPTSTR lpszConnectionName,
DWORD dwNameLen,
DWORD dwReserved
);
کد:
VB Define=
Private Declare Function InternetGetConnectedStateEx Lib "wininet.dll" Alias "InternetGetConnectedStateExA" _
(ByRef lpdwFlags As Long, _
ByVal lpszConnectionName As String, _
ByVal dwNameLen As Long, ByVal dwReserved As Long) As Boolean
. خود تابع اگر Connectionي را بيابد مقدار True را باز ميگرداند و پارامتر اول آن Type كاننكشن را باز ميگرداند. بقيه پارامترها را خودتان زحمت مطالعهشان را بكشيد. اما مقدار تعدادي از كانكشنها را بايد در يك متغيير Enum به شكل زير معرفي نماييد:
کد:
''''''''''''CONSTANT's'''''''''''''''
Private Enum ConFlags
' Connection VIA Proxy server.
Proxy = &H4S
' Modem is busy.
ModemIsBusy = &H8S
' Internet connection is currently Offline
Offline = &H20S
' Internet connection is currently configured
ConnectionIsConfigured = &H40S
' Internet connection VIA Modem.
Modem = &H1S
' Remote Access Server is installed.
RasInstalled = &H10S
' Internet connection VIA LAN.
LAN = &H2S
End Enum
Public Enum ConType
AnyConnection
Modem
LAN
RasInstalled
Proxy
InternetOffline
ConnectionConfigured
End Enum
. استفاده مستقيم از تابع فوق فقط براي تشخيص اينكه آيا Connectionي وجود دارد يا نه؟ به شكل زير است:
کد:
Dim Status As Boolean
Status = InternetGetConnectedStateEx(CntType, CntName, CntNameLen, 0)
. اما براي تشخيص Connection Type ميتوان از تابع فوق در در دل تابع ديگري استفاده نمود. به طور خلاصه به شكل زير:
کد:
Public Function IsConnected(ByVal ConnectionType As ConType) As Boolean
Dim Status As Boolean
Dim CntType As Long
Dim CntName As String = Space(50)
Dim CntNameLen As Long = 50
Status = InternetGetConnectedStateEx(CntType, CntName, CntNameLen, 0)
Select Case ConnectionType
' MODEM
Case Is = ConType.Modem
Return CBool(CntType And ConFlags.Modem And CLng(Status))
' LAN
Case Is = ConType.LAN
Return CBool(CntType And ConFlags.LAN And CLng(Status))
...
...
...
End Select
End Function
. تا اينجا برنامه ما تشخيص وجود يك Connection را داده است. اما آيا دسترسي به اينترنت از طريق اين كانكشن(يا كانكشنها) امكان پذير هست؟ از تابع
InternetCheckConnection به شكل مستقيم و يا در درون تابعي ميشود از آن استفاده نمود:
کد:
Syntax=
BOOL InternetCheckConnection(
LPCTSTR lpszUrl,
DWORD dwFlags,
DWORD dwReserved
);
. تعريف آن در VB به شكل:
کد:
VD Define=
Private Declare Function InternetCheckConnection Lib "wininet.dll" Alias "InternetCheckConnectionA" _
(ByVal lpszUrl As String, _
ByVal dwFlags As Integer, _
ByVal dwReserved As Integer) As Boolean
'If this flag is set, it forces a connection
Private Const FLAG_ICC_FORCE_CONNECTION As Integer = &H1
. روش استفاده از اين تابع براي تشخيص دسترسي داشتن به اينترنت:
کد:
' check an URL to find out it can Access.
Public Function CheckURL(ByVal TestUrl As String) As Boolean
Return InternetCheckConnection(TestUrl, FLAG_ICC_FORCE_CONNECTION, 0)
End Function
. براي اطمينان بهتره آدرس سايتي را چك كني كه سرور خفن و Sub Domain زياد دارد، (اگر اين اصطلاح آخري را درست استفاده كرده باشم!) مانند
www.Download.com يا
www.google.com و ...
. اميدوارم كه مطالب فوق مفيد واقع شود. احتمالن ازAPI مناسب براي Dialup استفاده نموديد اما كلاس Dialup برنامه خود را در لينك دونلود آوردهام.
. نكته آخر:
. جواد جان، اي عزيز جان برادر! چرا به جاي به روزرساني پست اول، نكات جديد را در پستهاي وسط تاپيكت ميچاپي!!! و همه را سر گردان ميكني!
اي كاشك من هم پشت كار شما را در نوشتن برنامهها و مطالب در فروم را داشتم، آن وقت تعداد مطالب من هم زايد ميشد نه اينقدر كم. كارت درسته ادامه بده ...
موفق باشيد.
خداحافظ
IgImAx
86/11/21