رفتن به مطلب
جامعه‌ی برنامه‌نویسان مُدرن ایران
  • 0
kambiz behnia

FIN-WAIT-2


سوال

با سلام

جهت ارتباط بین دو سیستم از  Socket TCP استفاده میکنیم.

متاسفانه در طرف کلاینتها سوکتها به درستی بسته نمیشوند (مراحل بستن تا آخر ادامه پیدا نمیکنند) و این امر موجب میشود تا تعداد زیادی از سوکتها در طرف سرور در حالت FIN-WAIT-2 باقی بمانند. جهت رفع این مشکل چه راه حلی پیشنهاد میکنید.

این نکته را هم اضافه کنم

1- تعدا کلاینهایی که به سرور وصل میشوند و یا وصل شده اند زیاد است.

2- بطور نرمال کلاینتها بعد از اتمام کار ارتباط خود را قطع میکنند به عبارتی اتصال دائم برقرار نیست

2- بعد قبول درخواست اتصال هر کلاینت برای هندل هریک از یک Thread مستقل استفاده میشود

3- در خواست بستن سوکت در Threadی که مسئول سرویس دهی به آن سوکت است انجام میشود.

 

در ادامه سوال، آیا برای قبول درخواست اتصال، خواندن، نوشتن و بستن سوکتها نیاز به استفاده از mutex هست (به عبارتی آیا منبع مشترکی را مورد استفاده قرار میدهند)

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

متشکرم.

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

3 پاسخ به این سوال تا کنون داده شده است

پست های پیشنهاد شده

  • 0

 با تشکر از پاسخ شما

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

CN.png.6a63fc5a447040f012d218052aa1d33e.png

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

البته درست میفرمائید از طرف کلاینت پروسه بستن سوکت بدرستی اجرا نمی شود و این نکته که بستن سوکت را تا نیمه ادامه میدهد بخاطر اصرار زیاد بود که متاسفانه آنرا تا آخر ادامه ندادند و نیمه کاره رها میکند "کد طرف کلاینت در دسترس (طبق معمول) نیست و امکان اصلاح آن وجود ندارد".

به دنبال راه حلی بودم تا وقتی یک طرف در حالت FIN_WAIT_2 قرار گرفت منتظر تایم اوت نمانده و سریعتر سوکت گرفته شده آزاد گردد.

 

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

 

 

تا آنجا که توانسته ام و جستجو کردم همگی تنظیم تایم اوت FIN_WAIT_2 را بع عنوان راه حل ارائه داده بودند به دنبال این بودم دوستانی که با این مشکل برخورد کرده اند غیر از این مورد راه حلی دیگری هم  پیدا کرده اند.

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0
در 14 ساعت قبل، فرهاد شیری گفته است :

این برنامه FIN_WAIT_2 را دقیقا نمیدونم چی هست ؟ ولی قطعا بنظر من هم تایم اوت یکی از روشهای خیلی خوب برای کنترل پورتهاست.

FIN_WAIT_2 یکی از stateهای سوکتهای TCPIP است. 

TCP-CLOSE_WAIT.png.2199e9fbd29e2dc5cb2a8c02f5ea73e5.png

متشکرم

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0
در 15 ساعت قبل، فرهاد شیری گفته است :

دارای سیستم عامل نیست یعنی؟ با IAR کامپایل شده؟ یا سیستم عامل توکار مثل freebsd

 

این FIN منظورتون همون ACK byte هست که معمولا برای ارسال و دریافت صحیح بسته ازش استفاده میکنیم؟

یعنی چی که هیچوقت ارسال نمیشه؟ چطوری تست کردید؟

کلا با چه پروتکلی کار میکنید با چه میکروکنترلری؟

الان منظورتون از سیستم عامل کدوم هست؟ سمت کلاینت که خوب هنوز درباره اش توضیحی ندادید ویا سمت سرور منظورتون هست که فکر نکنم منظورتون سرور باشه چون به پروتهای کلاینت ها که دسترسی ندارید از سرور

بله تقریبا متوجه برنامه شما شدم ولی سوال این هست که 

از چه سیستم عاملی استفاده میکنید ؟ توکار هست ؟ به سورس برنامه کلاینت دسترسی ندارید ولی به تنظیمات سیستم عامل که دسترسی دارید میتونید تعداد درخواستها را افزایش بدید اگر nix-base باشه که با fcntl خیلی کارها میشه کرد

این برنامه FIN_WAIT_2 را دقیقا نمیدونم چی هست ؟ ولی قطعا بنظر من هم تایم اوت یکی از روشهای خیلی خوب برای کنترل پورتهاست.

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

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

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

 

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

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

مهمان
پاسخ به این سوال ...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   حذف قالب بندی

  تنها استفاده از ۷۵ اموجی مجاز می باشد.

×   لینک شما به صورت اتوماتیک جای گذاری شد.   نمایش به عنوان یک لینک به جای

×   محتوای قبلی شما بازگردانی شد.   پاک کردن محتوای ویرایشگر

×   شما مستقیما نمی توانید تصویر خود را قرار دهید. یا آن را اینجا بارگذاری کنید یا از یک URL قرار دهید.


  • کاربران آنلاین در این صفحه   0 کاربر

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

×
×
  • جدید...