ورود

View Full Version : حس كردن قطع شبكه



seyed_farid
پنج شنبه 23 مهر 1388, 18:37 عصر
با سلام
من با استفاده از ClientSocket به سرور سوكت وصل ميشم. حال ميخواهم برنامه ام در صورت پاره شدن يا قطع شدن سيم ارتباطي قطعي را تشخيص بدهد و اعلام نمايد.
دوستان ميتونند كمكم كنند؟ ممنون...:تشویق::تشویق::تشویق:

vcldeveloper
جمعه 24 مهر 1388, 02:14 صبح
راه آماده ایی وجود نداره، می تونید در فواصل زمانی معین داده ایی به سرور بفرستید و از سرور بخواید که آن را Echo کند، اگر درخواستی از سرور دریافت نشد، یعنی دسترسی به سرور امکان پذیر نیست.

البته اگر تنها مسئله قطعی شبکه هست، می تونید آدرس IP کامپیوتر را چک کنید، اگر به شبکه ایی وصل نباشید، IP معتبری هم ندارید.

seyed_farid
شنبه 25 مهر 1388, 22:48 عصر
يعني راه بهتري نداره كه استاندارد باشه؟

vcldeveloper
یک شنبه 26 مهر 1388, 11:28 صبح
يعني راه بهتري نداره كه استاندارد باشه؟
استاندارد یعنی چی؟

seyed_farid
سه شنبه 28 مهر 1388, 09:07 صبح
با تشكر از لطفتون
منظورم اينه كه رويدادي براي اين موضوع قرار داده شده باشه كه بتونه وضعيت قطع و وصل را سنس كنه.:لبخندساده:

DAMAVAND
سه شنبه 28 مهر 1388, 18:49 عصر
با تشكر از لطفتون
منظورم اينه كه رويدادي براي اين موضوع قرار داده شده باشه كه بتونه وضعيت قطع و وصل را سنس كنه.:لبخندساده:



ميتونيد از کامپوننت IdIPWatch در تب INDY استفاده کنيد.
وقتي به شبکه وصل نيستيد IP شما 127.0.0.1 هست وقتي اما وقتي در شبکه هستيد
IP شما تغيير ميکند.
اين مثال رو يه نگاه بندازيد, به شبکه وارد يا از اون خارج بشيد و نتيجه رو ببينيد .

seyed_farid
چهارشنبه 16 دی 1388, 19:12 عصر
با سلام خدمت دوستان
من حالا تونستم قطع شدنش را بفهمم ولي حالا وقتي مي خواهم مجدداً وصل بشم از دستور زير استفاده مي كنم.

IF Command_Client_Socket.Socket.Connected Then
begin
Command_Client_Socket.Socket.Disconnect(Command_Cl ient_Socket.Socket.SocketHandle);
Command_Client_Socket.Active := False;
end;
Command_Client_Socket.Address := Trim(Host1.Text);
Command_Client_Socket.Port := StrToIntDef(LPort.Text,2658);
Command_Client_Socket.Active := True;
Result := (Command_Client_Socket.Active) ;

حالا پس از حدود 3000 بار كه خط قطع شده و برنامه براي اتصال با دستور بالا تلاش مي كنه يه خطا ميده كه ذيلاً آوردم و كلا سوكت را قطع ميكنه و بايد برنامه مجدداً اجرا بشه.
كسي ميتونه تو اين زمينه مرا راهنمائي كنه؟

seyed_farid
پنج شنبه 10 آذر 1390, 11:46 صبح
دوستان عزيز من هنوز اين مشكل را اساسي نتونستم حل كنم.:گریه:
كسي مشكل كار را نميدونه؟
البته يه جورايي مورد خطا را برطرف كردم ولي اگر كنترلهاي خاصي كه گذاشتم را بردارم مورد همچنان باقيست.
ممنون ميشم اگه راهنمائيم كنين.:تشویق:

ParsaNM
پنج شنبه 10 آذر 1390, 12:29 عصر
دوست عزيز يه راه قديمي هست من قديمها ازش استفاده ميکردم شايد بدردت بخوره ..
من اون قديما يه رابط گرافيکي شبکه داشتم که هرجاي شبکه قطع مي شد فوري تو رابط گرافيکي هم قطع ميشد و همه مطلع ميشن ...!
روش اين بود که تو يه زمان خاص با استفاده از دستور ping يه تست از شبکه ميگرفت و در يه فايل log ذخيره ميکرد و نهايتا اين فايل log رو چک ميکرد و ....
مثلا براي اينترنت 4.2.2.4 رو چک ميکرد ...!
راستش خيلي خوب کار ميکرد و و خيلي دقيق فقط مشکلش اين بود که تو يه زمان خاص ترافيک شبکه رو يه مقدار زياد ميکرد ... همين ..!

seyed_farid
پنج شنبه 24 آذر 1390, 18:30 عصر
ممنون از راهنماييتون
ميشه در مورد اين دستور و راه كارش بيشتر توضيح بدين و يا نمونه كدش را بدين؟:خجالت::تشویق: ممنون

ParsaNM
سه شنبه 29 آذر 1390, 10:16 صبح
دوست عزيز اون کد رو نمي تونم برات بفرستم ... چون حق مالکيتش براي من نيست ..!
ولي يه کد ديگه برات مي فرستم ... تو اين کد يک IP به صورت مداوم ping مي شه و اگر وصل باشه عبارت connected رو تو يه listbox مي نويسه واگر قطع باشه عبارت disconnect رو مي نويسه ... اين عمليات با زدن کليد روي صفحه شروع و زدن همين گليد خاتمه پيدا ميکنه ...!

خوب من براي مثال 4.2.2.4 رو پينگ ميکنم که اگر ping نشه يعني اينترنت نداري ...! ميتوني با قطع و وصل کردن مودمت اين گزينه رو تست کني ..

در ضمن جهت اطلاع بگم با اين روش ميتوني يه حالت ويژوال از شبکه خودت درست کني که هر قسمت قطع شد شکلش عوض بشه مثلا روش ضربدر بخوره و يا هشدار بده و يا حتي يه دستگاه خاص رو از برق بگه و يا به برق وصل کنه ...!!!!
اگر خواست بيشتر برات توضيح ميدم ...!:کف::کف:

seyed_farid
پنج شنبه 01 دی 1390, 14:20 عصر
دوست عزيز ممنون
ولي اين دستور ظاهراً تو پروسز برنامه وقفه ميندازه.
چطور بايد حل شه؟
پروگرس پائيني وقفه توش درست ميشه. نبايد وقفه تو برنامم باشه.
ممنون

seyed_farid
پنج شنبه 01 دی 1390, 14:41 عصر
ميتونيد از کامپوننت IdIPWatch در تب INDY استفاده کنيد.
وقتي به شبکه وصل نيستيد IP شما 127.0.0.1 هست وقتي اما وقتي در شبکه هستيد
IP شما تغيير ميکند.
اين مثال رو يه نگاه بندازيد, به شبکه وارد يا از اون خارج بشيد و نتيجه رو ببينيد .

دوست عزيز اگر بخواهيم بفهميم كه كامپيوتر ما به شبكه وصل هست يا نه اين جواب ميده. ولي اگر بخواهيم بفهميم كه مثلاً كامپيوتر ديگري با آدرس خاص مثلا 10.10.10.5 هم به شبكه وصل هست تا باهاش ارتباط برقرار كنيم بايد چيكار كرد؟
ممنون:تشویق:

seyed_farid
جمعه 02 دی 1390, 13:19 عصر
با سلام
من اينو گير اوردم فكر كنم چيز خوبي باشه.
براي اينكه بفهمم وصل هست يا نه.

ولي حالا اگر بخوام تو سرور مشخصات كلاينت چك بشه و نمايش داده بشه بايد چيكار كنم؟
ممنون:تشویق:

seyed_farid
سه شنبه 06 دی 1390, 14:19 عصر
دوستان كسي براي اين موضوع جواب پيدا نكرد؟:افسرده:
راه ديگه اي براش نيست؟:تشویق:

Mask
چهارشنبه 07 دی 1390, 11:36 صبح
ولي حالا اگر بخوام تو سرور مشخصات كلاينت چك بشه و نمايش داده بشه بايد چيكار كنم؟
ممنون
چرا از پینگ گردن استفاده نمیکنید؟

ParsaNM
پنج شنبه 08 دی 1390, 10:10 صبح
دوست عزيز روش پينگ کردن همه جا جواب مي ده ...! نمي دونم مشکلت چيه ... براي اينکه در برنامه ات هم وقفه نيفته ميتوني از Application.processMessage استفاده کني ...! يا با استفاده از تريدها و پروسس ها اين پروسس رو به صورت بک گرند اجرا کني ...!
همين ... خيلي راحته ...!

seyed_farid
پنج شنبه 08 دی 1390, 11:07 صبح
با سلام و تشكر از پاسخهاتون
استفاده از پينگ باعث هنگ لحظه اي تو برنامه ميشه.:ناراحت:
دستور Application.processMessage را در كجا استفاده كنم؟ با زدن دستور پينگ ديگه هنگ ميشه تاجواب بگيره. اگر روشش را بگيد ممنون ميشم.:قلب:

Mask
پنج شنبه 08 دی 1390, 13:35 عصر
دستور Application.processMessage را در كجا استفاده كنم؟ با زدن دستور پينگ ديگه هنگ ميشه تاجواب بگيره. اگر روشش را بگيد ممنون ميش
ببینید دوست عزیز. استفاده از دستور Application.processMessage رو بنده پیشنهاد نمیکنم.چون دست آخر سربار داره روی ترد اصلی برنامه.
میتونید پینگ رو در یه تر دیگه پیاده سازی کنید تا هیچ خللی در روند برنامتون پیش نیاد.
بنده از همین روش استفاده میکنم. و مشکلی هم تا کنون نداشتم.

ParsaNM
شنبه 10 دی 1390, 10:03 صبح
راستش منم از اين application.processmessage زياد خوشم نمياد ولي ابتدايي ترين چيزيه که ميشه ازش استفاده کرد ولي بهترين راه استفاده از تريدها و پروسس هاي بک گرونده ...!
يه جستجوي ساده تو همين سايت خيلي کمکت ميکنه دوست عزيز ..!

seyed_farid
شنبه 10 دی 1390, 10:51 صبح
ببینید دوست عزیز. استفاده از دستور Application.processMessage رو بنده پیشنهاد نمیکنم.چون دست آخر سربار داره روی ترد اصلی برنامه.
میتونید پینگ رو در یه تر دیگه پیاده سازی کنید تا هیچ خللی در روند برنامتون پیش نیاد.
بنده از همین روش استفاده میکنم. و مشکلی هم تا کنون نداشتم.

ميتونيد بيشتر راهنمائي كنيد يا نمونه بديد؟ ممنون :قلب::تشویق:

Mask
شنبه 10 دی 1390, 13:17 عصر
منظورتون رو از راهنمایی بیشتر متوجه نشدم. چون به نظرم همه چیز گویاست.
شما یه کلاس از ترد ایجاد کنید و یه idIcmpClient رو درون ترد بسازید.
میتونید برای نمایش عملیات خروجی هم مقدار بازگشتی این کنترل رو سینکرونایز کنید با ترد اصلی.
موفق باشید.

ParsaNM
دوشنبه 12 دی 1390, 13:13 عصر
دوست عزيز تو همين سايت يه جستجو کن در باره ساخت تريدها و نحوه مديريت پروسس ها فکر کنم مشکلت حل بشه ...

gbg
دوشنبه 12 دی 1390, 19:45 عصر
ببین اگه ترد نوشتن برات سخته از کامپوننت ترد Jedi استفاده کن خیلی راحت و بی دردسر و برای کارای ساده و متوسط خیلی خوبه

seyed_farid
سه شنبه 20 دی 1390, 13:53 عصر
استفاده از دستور Application.processMessage رو بنده پیشنهاد نمیکنم.چون دست آخر سربار داره روی ترد اصلی برنامه.

من تو برنامه ام از اين دستور براي ايجاد وقفه استفاده كرده ام.:اشتباه: اين دستور چه مشكلي ميتونه ايجاد كنه؟ مشكل حافظه هم داره؟:تشویق:
راه ديگه اي براي ايجاد وقفه تو برنامه هست كه مشكل نداشته باشه؟

Function Waitms( Second : integer):Boolean;
var t : integer;
begin
Result := False;
t := getTickCount;
while GetTickCount <= ( t+Second)
do Application.ProcessMessages;
Result := true;
end;


ضمناً من از TIdEcho استفاده كردم و فكر كنم اون مشكل را نداشته باشه.:متفکر: بايد يك مدتي چك بشه تا مشخص شه.

Mask
سه شنبه 20 دی 1390, 15:01 عصر
من تو برنامه ام از اين دستور براي ايجاد وقفه استفاده كرده ام. اين دستور چه مشكلي ميتونه ايجاد كنه؟ مشكل حافظه هم داره؟
در مورد این دستور و امتیازات و معایبش یادمه آقای تاجیک کامل توضیح داده بودند. جستجو کنید نمونش رو پیدا میکنید.
در ضمن تو بخش سوالات عمومی واسه پینگ تو یه ترد دیگه آقای مهری یه نمونه خوب گذاشته. میتونید ازش استفاده کنید.

ParsaNM
سه شنبه 20 دی 1390, 15:14 عصر
چرا از دستور sleep استفاده نمي کني ...؟
به ميلي ثانيه می باشد ..