ورود

View Full Version : آیا این نحوه استفاده از ping تأثیر منفی نداره؟



hamedsoft
پنج شنبه 05 اردیبهشت 1387, 22:33 عصر
با سلام خدمت تمامی دوستان خوبم در انجمن بزرگ برنامه نویس،

من در حال نوشتن یک برنامه شبکه ای هستم و حالا من قصد دارم یه حالتی رو برای برنامه بذارم که مدام چک کنه ببینه آیا ارتباط با شبکه برقرار هست یا نه، روشی که خودم به کار میخوام ببرم اینه که یه تایمر بذارم که (برنامه رو با دلفی دارم می نویسم) هر یک ثانیه ارتباط رو با استفاده از دستور پینگ با IP سرور چک کنه اگه پاسخ دریافت شد یعنی ارتباط برقرار هست و اگه نشد یعنی ارتباط برقرار نیست.

حالا سؤالی که برای من پیش اومده اینه که آیا این روش من استاندارد هست و اینکه باعث پایین اومدن سرعت نمیشه و چون قرار هست چندین کاربر (مثلا 30 نفر) همزمان روی خط باشند باعث فشار روی سرور نمیشه؟ و در کل آیا روشی بهتر از این روش برای چک کردن متداول ارتباط هست یا نه و اگه هست اون چه روشی هست و چطوری باید ازش استفاده کرد.

چندین سؤال دیگه هم دارم که انشالله وقتی این مورد به جواب رسیدم اونا رو هم مطرح می کنم.

ممنون

joker
جمعه 06 اردیبهشت 1387, 00:14 صبح
یک ارتباط ساده TCP برقرار کن ، ( سمت سرور فقط در حالت Listen باشه و کانکشن ها را قبول کنه
سمت کلاینت هم فقط ارتباط برقرار کنه
توی رویداد های خطا ( خطای دیسکانت ) میتونی تشخیص بدی که ارتباط قطع شده ( فکر کنم این روش مینیمم پهنای باند را مصرف میکنه که بتونی تشخیص بدی رتباط وصله یا قطعه :) )

hamedsoft
جمعه 06 اردیبهشت 1387, 01:41 صبح
یک ارتباط ساده TCP برقرار کن ، ( سمت سرور فقط در حالت Listen باشه و کانکشن ها را قبول کنه
سمت کلاینت هم فقط ارتباط برقرار کنه
توی رویداد های خطا ( خطای دیسکانت ) میتونی تشخیص بدی که ارتباط قطع شده ( فکر کنم این روش مینیمم پهنای باند را مصرف میکنه که بتونی تشخیص بدی رتباط وصله یا قطعه :) )
ممنون، میشه این مورد رو با ذکر یک مثال کوچک در دلفی بیان کنید؟

البته این مورد که شما بهش اشاره داشتید بیشتر برای حالتی هست که حداقل ارتباط خود شبکه داخلی برقرار باشه (اگه اشتباه نکنم) و موردی که من میخوام برای موقعی هست که ارتباط با شبکه به طور کامل قطع میشه.

Ali_M_K
شنبه 07 اردیبهشت 1387, 14:36 عصر
سلام
البته راهی که دوستمون ارائه کرد کایلا منطقیه اما اگه نمیخوای کانکشن بزنی، نگران بار شبکه در استفاده از ping نباش. سوئیچ های دستور ping رو چک کن، و تعداد paket ها رو کمتر کن.
مثلا یه بار packet بفرست :
C:\Documents and Settings\Administrator>ping 192.168.100.5 -n 1
Pinging 192.168.100.5 with 32 bytes of data:
Reply from 192.168.100.5: bytes=32 time<1ms TTL=128

cybercoder
شنبه 07 اردیبهشت 1387, 16:21 عصر
توی sample های دلفی هست همون طور که joker گفت فقط کافیه خطای disconnect رو handle کنی

hamedsoft
دوشنبه 23 اردیبهشت 1387, 17:37 عصر
ممنون، البته من روش Ping رو که خودم گفتم فکر نمي کنم زياد به درد بخور باشه چون باعث ميشه بار بيخودي روي شبکه بيفته حتي اگه يک پکت هم ارسال بشه بازم اون چيزي که من ميخوام نميشه چون بالاخره بايد بصورت مداوم ارتباط چک بشه و در اين صورت پکت هاي زيادي به سمت سرور ارسال ميشه و باعث ميشه سرور دون بشه به مرور ، اما در مورد روش TCP راستش من يه برنامه کوچيک نوشتم تا تست کنم ببينم آيا اين روش به درد کار من ميخوره که متأسفانه به درد کار من نخورد! چون من ميخوام به محض اينکه ارتباط به هر دليلي قطع شد به کاربر اطلاع داده بشه، ارتباط هم قرار نيست سرور/کلاينت باشه و تنها محض اين هست که مشخص بشه طرف الان که تو شبکه داخلي هست کابل شبکه و ارتباطش برقرار هست يا نه، تقريبا ميخوام يه چيزي تو مايه هاي خود ويندوز که موقعي که ارتباط با شبکه قطع ميشه ميگه Cable unplugged من يه همچين کاري رو ميخوام انجام بدم.

رضا عربلو
دوشنبه 23 اردیبهشت 1387, 17:52 عصر
من با خط دیالاپم Ping -t را اجرا کرده ام. هیچ ترافیکی بر روی شبکه نمی گذاردو اصلاً متوجه هیچ چیزی نشدم به جز مشغول شدن CPU.

hamedsoft
دوشنبه 23 اردیبهشت 1387, 19:05 عصر
من با خط دیالاپم Ping -t را اجرا کرده ام. هیچ ترافیکی بر روی شبکه نمی گذاردو اصلاً متوجه هیچ چیزی نشدم به جز مشغول شدن CPU.
درسته پکت هاي ping بسيار ناچيز هست که در حالت معمول به چشم نمياد اما شما فرض کنيد قرار هست همزمان 100 سيستم اين کار رو براي يک IP خاص انجام بدن، اينطوري بدجور بار بيخود ميفته روي شبکه و باعث ميشه شبکه بخوابه! من يه چيزي پيدا کردم براي اينکه توسط Delphi چک بشه که آيا ارتباط برقرار هست يا نه منتها يه بدي که داره اينه که هر بار بخوام من فقط يک کارت خاص رو چک کنم بايد کل کارت هاي شبکه روي سيستم رو Enumerate کنم که اين باعث ميشه CPU بيخودي گرفته بشه و هم باعث پايين اومدن کارايي و سرعت برنامه ميشه، هرچي هم روش فکر کردم تا چطوري مي تونم اين رو بهينه کنم هيچ چيزي دستگيرم نشد و بي فايده بود.

اين سورس اين کدي که گفتم هست:


procedure ShowNetworkStatus;
var
wmi : variant;
wmiService : variant;
nicstatus : variant;
card : Olevariant;
cnt : integer;
Enum: IEnumVariant;
P : IUnknown;
F : Cardinal;
connected : integer;
status : string;
begin
WMI:=CreateOleObject('WbemScripting.SWbemLocator') ;
wmiService := wmi.ConnectServer('.', 'root\wmi');
nicstatus := wmiService.InstancesOf('MSNdis_MediaConnectStatus' );
p := nicstatus._NewEnum;
p.QueryInterface(IEnumVariant, Enum);

for cnt := 0 to nicstatus.Count - 1 do
begin
Enum.Next(1, card, F);
connected := card.NdisMediaConnectStatus;
if (connected = 0) then
Status := 'connected'
else
Status := 'network cable unplugged';
ShowMessage(card.InstanceName + ' : ' + Status);
end;
end;

uses هايي که براي اجراي اين کد بايد اضافه بشه هم ايناس: ActiveX, ComObj

حالا من موندم که بالاخره چه راهي رو برم براي انجام اين کار ...