# Native Code > برنامه نویسی در Delphi > توسعه نرم افزارهای تحت شبکه >  حس كردن قطع شبكه

## seyed_farid

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

----------


## vcldeveloper

راه آماده ایی وجود نداره، می تونید در فواصل زمانی معین داده ایی به سرور بفرستید و از سرور بخواید که آن را Echo کند، اگر درخواستی از سرور دریافت نشد، یعنی دسترسی به سرور امکان پذیر نیست.

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

----------


## seyed_farid

يعني راه بهتري نداره كه استاندارد باشه؟

----------


## vcldeveloper

> يعني راه بهتري نداره كه استاندارد باشه؟


استاندارد یعنی چی؟

----------


## seyed_farid

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

----------


## DAMAVAND

> با تشكر از لطفتون
> منظورم اينه كه رويدادي براي اين موضوع قرار داده شده باشه كه بتونه وضعيت قطع و وصل را سنس كنه.




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

----------


## seyed_farid

با سلام خدمت دوستان
من حالا تونستم قطع شدنش را بفهمم ولي حالا وقتي مي خواهم مجدداً وصل بشم از دستور زير استفاده مي كنم.
     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

دوستان عزيز من هنوز اين مشكل را اساسي نتونستم حل كنم. :گریه: 
كسي مشكل كار را نميدونه؟
البته يه جورايي مورد خطا را برطرف كردم ولي اگر كنترلهاي خاصي كه گذاشتم را بردارم مورد همچنان باقيست.
ممنون ميشم اگه راهنمائيم كنين. :تشویق:

----------


## ParsaNM

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

----------


## seyed_farid

ممنون از راهنماييتون
ميشه در مورد اين دستور و راه كارش بيشتر توضيح بدين و يا نمونه كدش را بدين؟ :خجالت:  :تشویق:    ممنون

----------


## ParsaNM

دوست عزيز اون کد رو نمي تونم برات بفرستم ... چون حق مالکيتش براي من نيست ..!
ولي يه کد ديگه برات مي فرستم ... تو اين کد يک IP به صورت مداوم ping مي شه و اگر وصل باشه عبارت connected رو تو يه listbox مي نويسه واگر قطع باشه عبارت disconnect رو مي نويسه ... اين عمليات با زدن کليد روي صفحه شروع و زدن همين گليد خاتمه پيدا ميکنه ...!

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

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

----------


## seyed_farid

دوست عزيز ممنون
ولي اين دستور ظاهراً تو پروسز برنامه وقفه ميندازه.
چطور بايد حل شه؟
پروگرس پائيني وقفه توش درست ميشه. نبايد وقفه تو برنامم باشه.
ممنون

----------


## seyed_farid

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


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

----------


## seyed_farid

با سلام
من اينو گير اوردم فكر كنم چيز خوبي باشه.
براي اينكه بفهمم وصل هست يا نه.

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

----------


## seyed_farid

دوستان كسي براي اين موضوع جواب پيدا نكرد؟ :افسرده: 
 راه ديگه اي براش نيست؟ :تشویق:

----------


## Mask

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


چرا از پینگ گردن استفاده نمیکنید؟

----------


## ParsaNM

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

----------


## seyed_farid

با سلام و تشكر از پاسخهاتون
استفاده از پينگ باعث هنگ لحظه اي تو برنامه ميشه. :ناراحت: 
 دستور Application.processMessage را در كجا استفاده كنم؟ با زدن دستور پينگ ديگه هنگ ميشه تاجواب بگيره. اگر روشش را بگيد ممنون ميشم. :قلب:

----------


## Mask

> دستور Application.processMessage را در كجا استفاده كنم؟ با زدن دستور پينگ ديگه هنگ ميشه تاجواب بگيره. اگر روشش را بگيد ممنون ميش


ببینید دوست عزیز. استفاده از دستور Application.processMessage رو بنده پیشنهاد نمیکنم.چون دست آخر سربار داره روی ترد اصلی برنامه.
میتونید پینگ رو در یه تر دیگه پیاده سازی کنید تا هیچ خللی در روند برنامتون پیش نیاد.
بنده از همین روش استفاده میکنم. و مشکلی هم تا کنون نداشتم.

----------


## ParsaNM

راستش منم از اين application.processmessage زياد خوشم نمياد ولي ابتدايي ترين چيزيه که ميشه ازش استفاده کرد ولي بهترين راه استفاده از تريدها و پروسس هاي بک گرونده ...! 
يه جستجوي ساده تو همين سايت خيلي کمکت ميکنه دوست عزيز ..!

----------


## seyed_farid

> ببینید دوست عزیز. استفاده از دستور Application.processMessage رو بنده پیشنهاد نمیکنم.چون دست آخر سربار داره روی ترد اصلی برنامه.
> میتونید پینگ رو در یه تر دیگه پیاده سازی کنید تا هیچ خللی در روند برنامتون پیش نیاد.
> بنده از همین روش استفاده میکنم. و مشکلی هم تا کنون نداشتم.


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

----------


## Mask

منظورتون رو از راهنمایی بیشتر متوجه نشدم. چون به نظرم همه چیز گویاست.
شما یه کلاس از ترد ایجاد کنید و یه idIcmpClient رو درون ترد بسازید.
میتونید برای نمایش عملیات خروجی هم مقدار بازگشتی این کنترل رو سینکرونایز کنید با ترد اصلی.
موفق باشید.

----------


## ParsaNM

دوست عزيز تو همين سايت يه جستجو کن در باره ساخت تريدها و نحوه مديريت پروسس ها فکر کنم مشکلت حل بشه ...

----------


## gbg

ببین اگه ترد نوشتن برات سخته از کامپوننت ترد Jedi استفاده کن خیلی راحت و بی دردسر و برای کارای ساده و متوسط خیلی خوبه

----------


## seyed_farid

> استفاده از دستور 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

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


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

----------


## ParsaNM

چرا از دستور sleep استفاده نمي کني ...؟
به ميلي ثانيه می باشد ..

----------

