ايران ويج

نسخه‌ی کامل: ديسكانت شدن بي دليل يك ارتباط TCP
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
صفحه‌ها: 1 2
يك ماژول ClientSocket1 توي دلفي دارم كه مستقيم به يك پورت در LocalHost متصل هست
هر اطلاعاتي كه بهش بدم مستقيم Write ميكنه روي اون پورت و هر اطلاعاتي از اون پورت بهش برسه ميفرسته به يك ماژول ديگه و اون ميفرسته به يه جاي ديگه بيرون از كامپيوتر با اين قسمت مشكلي ندارم...
در حالت عادي كه تعداد پكتهاي ارسالي و دريافتي در واحد ثانيه زياد نيست مشكلي ندارم و برنامه به خوبي كار ميكنه
ولي وقتي سرعت نقل و انتقال ميره بالا 20 پكت در ثانيه ( 10 تا ارسال 10 تا دريافت ) يهو از سمت localhost كانكشن ارتباطي با ClientSocket1 ديسكانكت ميشه!
كسي تاحالا به همچين مشكلي برخورد كرده ؟

پيوست : حجم پكت ها به طور معمول كمتر از 10 بايت هست. و حداكثر 160 بايت
پيوست 2: نرم افزاري كه روي localhost هست مشكلي نداره و در حالت معمولي با ارتباطات اورجينال خودش درست كار ميكنه ساعتها......
پيوست 3: تمام پكتهاي ارسالي و دريافتي چك شدند ( دونه به دونه )‌چيزي غير از استراكچر استاندارد قاطيشون نبوده كه بگم اشكال از اينه.
پيوست 4: سرعت cpu نهايتا 2-3 درصدش گرفته ميشه و هميشه آزاده. رم هم همينطور آزاده و جائي به حد پر شدن نميرسند در اين پروسه

چيزي به ذهنتون ميرسه ؟



از کجا فهمیدی از سمت localhost كانكشن ارتباطي با ClientSocket1 ديسكانكت ميشه‌ ؟
(۲۵-مرداد-۱۳۹۰, ۲۰:۲۰:۰۲)babyy نوشته است: [ -> ]از کجا فهمیدی از سمت localhost كانكشن ارتباطي با ClientSocket1 ديسكانكت ميشه‌ ؟

براي تمام نقاطي كه امكان خطا ميدادن bp تعيين كردم ، اولين نقطه ديسكانتي در سيستم ارتباط لوكال هاست بود با ClientSocket

من هيچ كدي براي ديسكانت شدن ننوشتم پس به صورت معمولي بايد قطعي از اون سمت بياد ، ولي اون سمتlocalhost در حالت معمول ( ارتباط با نرم افزار خودش ) هيچ وقت ديسكانكتي نميده
خب من كه نگفتم ديسكانت كن علت چي ميتونه باشه؟
(۲۵-مرداد-۱۳۹۰, ۲۰:۳۰:۳۴)joker نوشته است: [ -> ]براي تمام نقاطي كه امكان خطا ميدادن bp تعيين كردم ، اولين نقطه ديسكانتي در سيستم ارتباط لوكال هاست بود با ClientSocket

من هيچ كدي براي ديسكانت شدن ننوشتم پس به صورت معمولي بايد قطعي از اون سمت بياد

من اینطور متوجه شدم که:
۱ - الا برنامه شما به یه برنامه ی دیگه در localhost ارتباط برقرار کرده
۲ - اون برنامه localhost رو شما ننوشتید ؛ بلکه یه برنامه ی آمادست (مثلا یاهو مسنجر) که شما با ClientSocket پروتوکل هاش رو تقلید کردید و باهاش اطلاعات رو بدل میکنید

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

اگه جواب مثبته ؛ از جمله ی بالا میشه دو نتیجه گرفت :
۱ - همون که شما گفتید (برنامه localhost ارتباط قطع کرده)
۲ - برنامه دلفی خودتون (ClientSocket) به علت زیر بار شدید پکتها دچار اختلال شده و هندل ارتباطش با localhost از بین رفته ! در نتیجه تو اون bp تعیین شده هم خطا داده !
خب ، ادامه اش برام مهمه :)
رفع مشكل؟
هنوز مطمءن نیستی مشکل از کجاست چی رفع مشکلی کنییم ؟ :)
اگه حرفای بالا درست باشه ؛ خب ماجول ClientSocket بد برنامه نویسی شده ؛
معمولا واسه اینکه برنامه تو اینجور مواقع قاط نزنه بجای اینکه مستقیم پردازش بشه اطلاعات اول میریزنش تو یه پشته
البته اينم حدس زدم ، براي همين يك ServerSocket خودم درست كردم و ارتباط را انتقال دادم به اون و 10هزارتا پكت بدون يك لحظه وقفه به صورت ممتد و رندوم بهش ارسال كردم ، بدون هيچ مشكلي دريافت و ارسال داشت.
ClientSocket استاندارد خود بورلنده! بد برنامه نويسي نشده :))
از حرفای بالانتیجه میگیریم :
ClientSocket که کارش درسته
برنامه localhost هم که درست کار میکنه با برنامه خودش
پروتکل های tcp/ip که درست طراحی شدن

۱ - این وسط فقط برنامه خودت میمونه ؛
۲- و احتمال اینکه اون برنامه localhost تو سرعت زیاد قاط میزنه ؛

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

اين راه رو تست کن شايد جواب بده:
تمام پکت های دريافتی رو تو يه ليست بريزيد (توی برنامه اي که با سرور در ارتباط هست) و بعد تو يه تريد ديگه با وقفه کم پکت ها رو به ترتيب به سرور ارسال کنيد
براي پكتها در انتهاي هركدوم يك crc گذاشتم _ حواسم هست كه موقع تحويل به برنامه برش بدارم_
پكتهاي غير استانداردي نميان يعني همه سالم ،
پكتهاي دريافتي هم با انواع مدلهاي وقفه به سمت سرور ارسال شدند
ولي ولي ولي ليست كردنشون قسمت بد ماجرا همينه " پكت لاست "شدن پروتكل UDP هست

يعني احتمال ميدم وقتي سرور يك درخواست خاص ميفرسته ، كلاينت داره يه جواب ديگهاز قبل را بهش ميده ، يا جواب همون موقع نميرسه ، يا جا مي افته با يك جواب ديگه جايگزين ميشه و به همين دليل سرور ميبينه كه جواب صحيح نيست ، ريجكت ميكنه

يه راه حل پيشنهاد بدين.
(۲۶-مرداد-۱۳۹۰, ۱۵:۱۲:۴۳)joker نوشته است: [ -> ]يعني احتمال ميدم وقتي سرور يك درخواست خاص ميفرسته ، كلاينت داره يه جواب ديگهاز قبل را بهش ميده ، يا جواب همون موقع نميرسه ، يا جا مي افته با يك جواب ديگه جايگزين ميشه و به همين دليل سرور ميبينه كه جواب صحيح نيست ، ريجكت ميكنه

يه راه حل پيشنهاد بدين.

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

به نظرم يه کلاس کامل برای کار با پروتکل اون سرور بنويس بعد به جای arry کردن سوکت ها اون کلاس رو arry کن

اينطوری هم از به هم ريختگی ديتا تا حد زيادی جلوگيری ميشه و هم اگه بعداً هر تغييری خواستی انجام بدی رو همون يه کلاس انجام ميدی و منظم تر ميشه

از TCP استفاده کرده بودی اينهمه دردسر نداشتی


صفحه‌ها: 1 2