PDA

View Full Version : قطع شدن ناگهانی کانکشن!!



unit001
یک شنبه 10 دی 1391, 10:36 صبح
با سلام

من یه مشکل دارم که فکر کنم زیادم برای کسی پیش نمیاد. وقتی با winsock بین دو تا کامپیوتر ارتباط برقرار می کنم, در صورتی که یکی از کامپیوتر ها به صورت ناگهانی خاموش یا ریستارت بشه. از کامپیوتر دیگه نمی شه فهمید که اون یکی کامپیوتر دیگه کانکشنش برقرار نیست. یعنی رویداد close یا error اجرا نمی شه.

حالا می خواستم بپرسم آیا در winsock راهی برای فهمیدن این قضیه که کامپیوتر ریموت قطع شده یا نه وجود داره؟ مثلا refresh یا هر چیز دیگه؟!

ببخشید خیلی طولانی شد!!

با تشکر

SHD.NET
یک شنبه 10 دی 1391, 11:19 صبح
باید روی آنلود برنامتون بنویسید وقتی که بسته شد یه دستور کلوز به همه کلاینت ها بفرسته تا برنامه های دگ متوجه بشن .

:چشمک:\\\موفق باشید///:چشمک:

unit001
یک شنبه 10 دی 1391, 11:37 صبح
ممنون از جوابتون.

نه منظور من در حالتی بود که سیستم یهو و بدون هیچ گونه پیش بینی ریستارت بشه. مثلا وقتی که دکمه روی کیس رو بزنین. در این حالت که رویداد unload اجرا نمی شه.

با تشکر

M.T.P
یک شنبه 10 دی 1391, 12:37 عصر
با سلام

من یه مشکل دارم که فکر کنم زیادم برای کسی پیش نمیاد. وقتی با winsock بین دو تا کامپیوتر ارتباط برقرار می کنم, در صورتی که یکی از کامپیوتر ها به صورت ناگهانی خاموش یا ریستارت بشه. از کامپیوتر دیگه نمی شه فهمید که اون یکی کامپیوتر دیگه کانکشنش برقرار نیست. یعنی رویداد close یا error اجرا نمی شه.

حالا می خواستم بپرسم آیا در winsock راهی برای فهمیدن این قضیه که کامپیوتر ریموت قطع شده یا نه وجود داره؟ مثلا refresh یا هر چیز دیگه؟!

ببخشید خیلی طولانی شد!!

با تشکر

بله ، برای این مشکل یک راه حل هست که تقریبا اکثر برنامه نویس های حرفه ای برای برنامه های تحت شبکه مدنظر قرار میدن و اون
ارسال دیتا (و لو ناچیز در حد یک کاراکتر) در یک بازه زمانی مشخص برای تشخیص ارتباط سالم از مشکوک.


شما در تایمر برنامه تون می تونید یک تابع رو هر 10 ثانیه یکبار فرا خوانی کنید.

به عنوان مثال:

Sub Ping()
If wskServer.State = sckConnected Then
wskServer.SendData "<PING>"
Else
wskServer.Close
End If
End Sub

با این حالت وقتی سوکتی با حالت ارتباط ناسالم دیتایی رو ارسال کنه بعد از مدت 10 الی 15 و نهایتا 30 ثانیه متوجه عدم دریافت
دیتا در مقصد شده و سوکت از حالت به اصطلاح Connected خارج و شما می تونید متوجه این موضوع بشید.

unit001
یک شنبه 10 دی 1391, 13:00 عصر
خیلی خیلی ممنون از جوابتون.

من این کاری که شما گفتید رو انجام دادم ولی به یه صورت دیگه. آیا شما مطمئنید که این روش جواب میده. یعنی نهایتا تا 30 ثانیه متوجه می شه؟

یه سوال دیگه هم داشتم. حالا مثلا به برنامه اصلی 50 تا برنامه متصل بودن که هر کدوم یه کانکشن جدا دارن. وقتی من تو تایمر می گم که هر مثلا 5 ثانیه یه چیزی به 50 تا کامپیوتر متصل بفرست. این وسط چند تا از اونا این اطلاعاتو دریافت نمی کنن. که با ارسال پاکت بعدی اونایی که مثلا چند ثانیه یا چند دقیقه قبل فرستاده شده بودن تازه به کامپیوتر ریموت می رسن.
این ایراد توی همه ی برنامه ها پیش میاد. یا مثلا روش خاصی داره. چون من هر وقت چندین پاکت رو همزمان فرستادم این مشکل پیش اومده.

با تشکر

M.T.P
دوشنبه 11 دی 1391, 14:13 عصر
خیلی خیلی ممنون از جوابتون.

من این کاری که شما گفتید رو انجام دادم ولی به یه صورت دیگه. آیا شما مطمئنید که این روش جواب میده. یعنی نهایتا تا 30 ثانیه متوجه می شه؟

یه سوال دیگه هم داشتم. حالا مثلا به برنامه اصلی 50 تا برنامه متصل بودن که هر کدوم یه کانکشن جدا دارن. وقتی من تو تایمر می گم که هر مثلا 5 ثانیه یه چیزی به 50 تا کامپیوتر متصل بفرست. این وسط چند تا از اونا این اطلاعاتو دریافت نمی کنن. که با ارسال پاکت بعدی اونایی که مثلا چند ثانیه یا چند دقیقه قبل فرستاده شده بودن تازه به کامپیوتر ریموت می رسن.
این ایراد توی همه ی برنامه ها پیش میاد. یا مثلا روش خاصی داره. چون من هر وقت چندین پاکت رو همزمان فرستادم این مشکل پیش اومده.

با تشکر

این باگی که شما بهش اشاره کردید از طرف مایکروسافت برای وینسوک اعلام شد و مایکروسافت نسخه اصلاح شده وینسوک رو ارائه کرد.
لینک گزارش باگ وینسوک (http://support.microsoft.com/kb/245159)
یعنی در واقع کامپوننت وینسوکی که به صورت پیش فرض با نصب ویژوال بیسیک نصب میشه این مشکل رو داره.

این باگ در کامپوننت وینسوک ورژن 6.01.9782 برطرف شده است.
می تونید از اینترنت این نسخه رو جستجو و دانلود کنید.
توصیه می کنم فقط همین نسخه رو استفاده کنید چون نسخه جدیدترش هم یک باگ دیگه داره.

و از همه مهمتر برای اینکه برنامه تون بی نقص از آب درآد قبل از اجرای برنامه ورژن وینسوک سیستم رو چک کنید اگه مخالف ورژنی بود
که عرض کردم به کاربر هشدار بدید و از اجرای نرم افزار جلوگیری کنید.(البته اگه نرم افزارتون دست مشتری ست)

Hashemvp
دوشنبه 11 دی 1391, 15:22 عصر
دوست عزیز M.T.P (http://barnamenevis.org/member.php?132020-M.T.P) امکانش هست این نسخه از این کامپونت رو برای دانلود بذاری؟

M.T.P
دوشنبه 11 دی 1391, 17:05 عصر
اینجا (http://barnamenevis.org/showthread.php?365050-%D8%AA%DA%A9%D9%85%DB%8C%D9%84-%D8%B3%D8%A7%D8%AE%D8%AA-%DB%8C%DA%A9-NetChat&p=1614536&viewfull=1#post1614536) آپلود کردم قبلا ، دانلود کنید.

m2011kh
دوشنبه 11 دی 1391, 17:43 عصر
سلام به همه ی دوستان.
من برای مطمئن شدن برای وصل شدن کلاینت ها یه روشی استفاده میکنم.گفتم که دوستان هم بدونن.
سرور در مدت های مشخص به همه ی کلاینت ها پیامی رو میفرسته.
کلاینت ها اگه اتصالشون برقرار بود جواب میدن و رسیدن پیام رو تأیید میکنن و اگه هر کلاینتی جواب رو ارسال نکرد مشخص میشه که اون کلاینت دیگه متصل نیست و وینساک رو میبنده.
با تشکر از دوستان
MMD

M.T.P
دوشنبه 11 دی 1391, 17:55 عصر
سلام به همه ی دوستان.
من برای مطمئن شدن برای وصل شدن کلاینت ها یه روشی اتفاده میکنم.گفتم که دوستان هم بدونن.
سرور در مدت های مشخص به همه ی کلاینت ها پیامی رو میفرسته.
کلاینت ها اگه اتصالشون برقرار بود جواب میدن و رسیدن پیام رو تأیید میکنن و اگه هر کلاینتی جواب رو ارسال نکرد مشخص میشه که اون کلاینت دیگه متصل نیست و وینساک رو میبنده.
با تشکر از دوستان
MMD

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

unit001
دوشنبه 11 دی 1391, 19:22 عصر
جناب آقا/خانم M.T.P خیلی ممنون که به مشکل من رسیدگی کردید.

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

با تشکر.

m2011kh
دوشنبه 11 دی 1391, 23:25 عصر
سلام به همه دوستان.
بله آقای M.P.T،اگه از دو سمت فرستاده بشه خیلی بهتره.مطلب مفیدی بود.
Thanks
MMD

ra0661
شنبه 21 اردیبهشت 1392, 18:55 عصر
اول سلام بعد یه چیز بگم مغزت باز بشه شاید جرقه باشه برات بتونی استفاده مفید بکنی

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

موفق باشی

unit001
سه شنبه 24 اردیبهشت 1392, 22:47 عصر
دوست عزیز بنظرت راهنمایی آقای M.T.P کاملتر نبود!!!!:بامزه:

niko2008
چهارشنبه 25 اردیبهشت 1392, 06:57 صبح
دوست عزیز بنظرت راهنمایی آقای M.T.P کاملتر نبود!!!!:بامزه:

نخیر ............
باز نیفتاد یه مثال عملی میخوام جون من تازه با سوکت کار میکنم؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟ ؟؟؟؟؟؟؟؟؟