PDA

View Full Version : سوال: مشکل در تشخیص رفتن برق در برنامه تحت شبکه



DoDoklak
دوشنبه 14 تیر 1389, 17:51 عصر
من یک برنامه تحت شبکه دارم که هر کاربر که تو سیستم تعریف میشه یک فیلد از نوع Boolean داره که True میشه و وقتی هم خارج میشه اون فیلد false میشه و وقتی کاربر میخواهد وارد سیستم بشه بررسی میشه که آیا قبلا وارد شده یا نه اگر قبلا وارد شده باشه اجاره ورود مجدد نداره
در کل با یک نام کاربری نمیشه دوبار وارد شد (به خاطر مسایل مالی نرم افزار که حداکثر با 4 کاربر باید کار کنن)

حالا مشکل زمانی پیش میاد که کاربر بدون خارج شدن معمول برنامه (رفتن برق یا هنگ سیستم یا ...) خارج بشه در این صورت فیلد مربوطه True میمونه و کاربر نمیتونه وارد بشه.
اگر این حالت رو هم برداریم دیگه نمیشه محدودیت 4 کاربر رو اعمال کرد چون با یک نام میشه همیشه وارد شد

آیا کسی نظری برای این مشکل دار؟

nasim bahari
سه شنبه 15 تیر 1389, 15:53 عصر
سلام گلم..................


چند راه داری که من فعلاً سه تا را پیشنهاد می دم...............

1- رجیستری
2- فایل
3- DataBase

خب نرم افزار شما یک یا چند راه برای خروج داره که وقتی کاربر خارج میشه اون فیلدی که گفتی false میشه. حال می تونی یک فیلد هم بذاری که وقتی کاربر از نرم افزار خارج میشه مثلاً True بشه. و با وارد شدن اون False بشه. حال اگه برق بره یا سیستم هنگ کنه . اون فیلد false نمی شه و نرم افزار می فهمه که کاربر به صورت عادی خارج نشده است.
همین کار رو با مقداری توی رجیستری یا فایل هم انجام بدی........................

امیدوارم که کمکت کرده باشم................
گلم......خوش باش و همیشه سبز...........

DoDoklak
سه شنبه 15 تیر 1389, 16:59 عصر
1- رجیستری
2- فایل


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




3- DataBase



این هم همون مشکل روش منو داره

اگر کاربر به صورت غیر معمول خارج بشه فیلدها دستکاری نمیشه و کاربر زمانی که میخواهد دوباره وارد سیستم بشه برنامه پیغام اینکه کاربر مورد نظر در سیستم وارد شده است رو دریافت میکنه

nasim bahari
سه شنبه 15 تیر 1389, 17:17 عصر
مسلماً این روش هایی که به فکر من رسیده بود باید بروی سرور ( که نرم افزار server ) بروی اون قرار داره پیاده سازی شود.

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

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

اگه بازم جوابتو نگرفتی ......بیشتر در مورد مشکلت توضیح بده...........تا با همفکری به نتیجه برسیم............

fazelm
سه شنبه 15 تیر 1389, 17:39 عصر
من یک برنامه تحت شبکه دارم که هر کاربر که تو سیستم تعریف میشه یک فیلد از نوع Boolean داره که True میشه و وقتی هم خارج میشه اون فیلد false میشه و وقتی کاربر میخواهد وارد سیستم بشه بررسی میشه که آیا قبلا وارد شده یا نه اگر قبلا وارد شده باشه اجاره ورود مجدد نداره
در کل با یک نام کاربری نمیشه دوبار وارد شد (به خاطر مسایل مالی نرم افزار که حداکثر با 4 کاربر باید کار کنن)

حالا مشکل زمانی پیش میاد که کاربر بدون خارج شدن معمول برنامه (رفتن برق یا هنگ سیستم یا ...) خارج بشه در این صورت فیلد مربوطه True میمونه و کاربر نمیتونه وارد بشه.
اگر این حالت رو هم برداریم دیگه نمیشه محدودیت 4 کاربر رو اعمال کرد چون با یک نام میشه همیشه وارد شد

آیا کسی نظری برای این مشکل دار؟

توی هر کلاینت یه فایل بذار بعد از توی سرور مثلا هر یک دقیقه یکبار چک کنه آیا به اون فایل توی کلاینت دسترسی دارد یا نه و اگر دسترسی داشت که یعنی اون سیستم وصل هست ولی اگه نداشت یعنی دستگاه خاموشه و اون وقت اگر خاموش بود می فهمه که اون کاربر از پای سیستم بلند شده به هر دلیلی مثلا به دلیل قطعی برق که شما می خواهین
امید وارم منظور رو رسونده باشم اگر نه بگو

DoDoklak
چهارشنبه 16 تیر 1389, 09:21 صبح
توی هر کلاینت یه فایل بذار بعد از توی سرور مثلا هر یک دقیقه یکبار چک کنه آیا به اون فایل توی کلاینت دسترسی دارد یا نه و اگر دسترسی داشت که یعنی اون سیستم وصل هست ولی اگه نداشت یعنی دستگاه خاموشه و اون وقت اگر خاموش بود می فهمه که اون کاربر از پای سیستم بلند شده به هر دلیلی مثلا به دلیل قطعی برق که شما می خواهین


این روش شاید 20% بتونه جواب بده

چون احتمال داره سیستم کلاینت خاموش نشده باشه بلکه برنامه فقط خارج شده (حالا به هر دلیلی)
در این صورت سرور به فایل دسترسی داره و خارج شدن کلاینت رو تشخیص نمیده

در صورت خاموش شدن هم میتونه در عرض 40 ثانیه دوباره کلاینت روشن بشه و احتمال زیاد هم داره سرور بعد از روشن شدن دوباره کلاینت فایل رو بازبینی کنه و باز هم وجود داره و دوباره خروج کلاینت رو تشخیص نمیده

به صورت مداوم هم نمیشه که سرور، کلاینت رو بررسی کنه چون ترافیک زیادی به شبکه تحمیل میشه

nima898
چهارشنبه 16 تیر 1389, 11:27 صبح
خب نرم افزار شما یک یا چند راه برای خروج داره که وقتی کاربر خارج میشه اون فیلدی که گفتی false میشه. حال می تونی یک فیلد هم بذاری که وقتی کاربر از نرم افزار خارج میشه مثلاً True بشه. و با وارد شدن اون False بشه. حال اگه برق بره یا سیستم هنگ کنه . اون فیلد false نمی شه و نرم افزار می فهمه که کاربر به صورت عادی خارج نشده است.
همین کار رو با مقداری توی رجیستری یا فایل هم انجام بدی........................
این روش که جواب نمیده شاید کاربر هموز پشت سیستم هست
تو سیستم اتوماسیون اداری ما اگه یک کاربر دوبار وارد بشه دفعه دوم پیغام میده که شما خارج نشده اید که میشه اونو (نفر اول) بیرون انداخت یا اینکه باهش کاری نداشته باشیم. موقعی که سیستم هنگ میکنه و دوباره وارد میشیم سیستم در فکر میکنه که یکی دیگه وارد شده

nasim bahari
چهارشنبه 16 تیر 1389, 11:49 صبح
سلام گلم...........

جواب ما رو ندادی ؟

من همون روشی که دوستمون پیشنهاد دادن رو گفتم ولی دوستمون گفتن فایل مورد نظر روی کلاینت هاباشه که خودتون مشکلاتش رو اشاره کردین ولی من پیشنهاد دادم که این فایل بروی سرور باشه...........

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

اگه مشکلی بود............
لطفاً بیشتر توضیح بده............

M.T.P
چهارشنبه 16 تیر 1389, 11:51 صبح
دوست عزیز من یه همچین نرم افزاری رو برای یک گیم نت نوشتم و دارم استفاده میکنم.
در صورت قطع ارتباط کلاینت ناشی از قطع برق حتی پورت در حال اتصال آزاد هم نمیشه و تو سرور کانکت تلقی میشه.
اما راه کاری که من به کار بردم و جواب داد اینه که شما هر 30 ثانیه یک مرتبه یک پیام با عنوان دلخواه مثلا GetID یا Ping از طرف سرور به کلاینت ارسال کنی و کلاینت هم جواب شما رو بلافاصله بده که این روند حاکی از ارتباط بدون مشکل خواهد بود اما اگه فرضا تا 3 مرتبه که میشه 1.5 دقیقه کلاینت پاسخ نداد ارتباط مشکوک و به اصلاح مقطوع رو میرسونه که شما بلافاصله از طرف سرور Boolean رو False و ارتباط رو قطع رقم میزنید.
موفق باشید. :قلب:

M.T.P
چهارشنبه 16 تیر 1389, 11:58 صبح
و اما یک نکته تجربی دیگه اینکه ارتباطی که از طرف کلاینت به خاطر قطع برق و یا نگه داشتن کلید power و خاموش شدن سیستم صورت میگیره و سرور همچنان ارتباط رو برقرار میدونه ، در صورت ارسال هرگونه پیام از سمت سرور بعد از مدت 15 تا 20 ثانیه ویندوز ارتباط رو مشکل دار گزارش میکنه و خط ارتباطی Erorr رو گزارش میده که شما میتونید مطلب رو متوجه و ارتباط رو Close کنید.

hossein-khoshseyar
پنج شنبه 17 تیر 1389, 08:01 صبح
و اما یک نکته تجربی دیگه اینکه ارتباطی که از طرف کلاینت به خاطر قطع برق و یا نگه داشتن کلید power و خاموش شدن سیستم صورت میگیره و سرور همچنان ارتباط رو برقرار میدونه ، در صورت ارسال هرگونه پیام از سمت سرور بعد از مدت 15 تا 20 ثانیه ویندوز ارتباط رو مشکل دار گزارش میکنه و خط ارتباطی Erorr رو گزارش میده که شما میتونید مطلب رو متوجه و ارتباط رو Close کنید.

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

M.T.P
پنج شنبه 17 تیر 1389, 10:54 صبح
من هم دقیقا توی یه برنامه کاری که شما گفتی رو انجام دادم اما اونجا یه مشکلی برام پیش می اومد و اون هم این بود که بهد از فهمیدن اینکه کلاینت قطع شده من هم پورت رو می بستم بعد اون هر یک دقیقه یکبار سعی می کردم که چک کنم کلاینت وصل شده یا نه اما با اینکه کلاینت وصل شده بود من نمی تونستم تشخیص بدم که وصل شده یعنی کلاینت جوابم رو نمیداد مگر اینکه برنامه سرور رو ببندم و دوباره باز کنم
میشه راهنماییم کنید ؟ ممنون

سلام
نحوه ارتباط در برنامه من اینطور هست که از کنترل Winsock استفاده میکنم.
در هنگام اجرا سرور کنترل وینسوک رو به یک پورت که کاربر بهش میده Listen میشه.
کلاینت ها هم به همین پورت تنظیم و کانکت میشن.
هر زمان که درخواست ارتباط برای سرور پیش میاد بلافاصله یک وینسوک بصورت آرایه Load و اتصال رو برقرار میکنه ، بنابراین وینسوک مادر یعنی اولی همیشه Listen و آماده پذیرفتن اتصال هست.
هر کدوم از وینسوک های سرور که براشون مشکلی پیش میاد بلافاصله وضعیت رو گزارش و Unload میشن.(پس در موقع ارتباط بعدی کلاینت به پورت مادر وصل میشه ومشکلی پیش نمیاد. البته باید کلاینت ها هم طوری کدنویسی کنی که در صورت Error یا Close شدن بلافاصله کانکت کنند و خوابشون نبره :لبخند:)

خب شما اگه الگوریتم برنامه تون رو بگی میشه کمکتون کرد. :قلب:

MehdiLiver
جمعه 18 تیر 1389, 01:53 صبح
بهترین کار اینه که تو یک رنج زمانی خاصی ، از کاربران متصل به برنامتون پینگ بگیرید
فکر کنم با این کار مشکلتون حل شه ، هم مطمئن هست هم عملی هم ساده

غلامرضا شریفی
یک شنبه 20 تیر 1389, 10:27 صبح
قطع برق و يا خاموش كردن سيستم چيزي نيست كه هر دقيقه صورت بگيرد وقتي هم اتفاق افتاد كاربري كه لاگين هست يك مسئوليتي در قبال سيستم دارد كه بعد از وصل بايد انجام دهد و ان هماهنگي با كاربر ارشد است كه يكي از اختيارات ان ورود بدون محدوديت است و در صورت اطمينان از فعال نبودن يكي از كاربران بتواند آن را از ليست خارج كند
وقتي يك شبكه تعريف ميكنيم طبيعي است كه سطح اختيارات كاربران متفاوت باشد

vbworm
پنج شنبه 24 تیر 1389, 05:38 صبح
سلام
نحوه ارتباط در برنامه من اینطور هست که از کنترل Winsock استفاده میکنم.
در هنگام اجرا سرور کنترل وینسوک رو به یک پورت که کاربر بهش میده Listen میشه.
کلاینت ها هم به همین پورت تنظیم و کانکت میشن.
هر زمان که درخواست ارتباط برای سرور پیش میاد بلافاصله یک وینسوک بصورت آرایه Load و اتصال رو برقرار میکنه ، بنابراین وینسوک مادر یعنی اولی همیشه Listen و آماده پذیرفتن اتصال هست.
هر کدوم از وینسوک های سرور که براشون مشکلی پیش میاد بلافاصله وضعیت رو گزارش و Unload میشن.(پس در موقع ارتباط بعدی کلاینت به پورت مادر وصل میشه ومشکلی پیش نمیاد. البته باید کلاینت ها هم طوری کدنویسی کنی که در صورت Error یا Close شدن بلافاصله کانکت کنند و خوابشون نبره :لبخند:)

خب شما اگه الگوریتم برنامه تون رو بگی میشه کمکتون کرد. :قلب:

بهترین راهه