ايران ويج

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

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

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

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

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

از TCP استفاده کرده بودی اينهمه دردسر نداشتی
از TCP نميتونم استفاده كنم و الا 1 ثانيه هم معطلش نميكردم :)

يك مثال ساده براي اين چيزي كه گفتي ميتوني بنويسي ؟

من خودم دلفی کار نيستم ولی دلفی کاران را دوست دارم
با vb.net ميتونم

[تصویر:  1357572546.jpg]

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

تقريبا اشكال را فهميدم ( به قول يارو هر سه نفرمون اشتباه كرديم )
از نظر تئوري ارتباط و نحوه چيدمان و انتقال ، همه چيز صحيح هست.
سروري كه دارم بهش وصل ميشم يك سرور بازي هست كه هر 100 ميلي ثانيه يك پكت Syncronize به سمت كلاينت ميفرسته( باكد مشخصه 0x0C ) و كلاينت يك مقدار hash شده را با يك كد مشخصه خاص ( اينجا 0x27 )‌ به سمت سرور ارسال ميكنه
اگه اين مقدار به سرور نرسه يا اشتباه برسه ،يا جابجا برسه ، سرور فكر ميكنه كلاينت ديسكانت شده ، و كانكشن را كلوز ميكنه
نحوه محاسبه اين مقدار هش شده را هنوز پيدا نكردم ، خيلي عجيبه رفتارش !
كد 0x0C و ديتاي اون ثابته ولي از سمت كلاينت رندوم هش ميشه ، بر چه اصولي را نميدونم.


ارتباط چون UDP هست و پك لاست دارم اتفاقي كه مي افته اينه
سرور يك درخواست اعتبار سنجي ميفرسه
كلاينت يا نميگيره پكت را يا اگه پكت را گرفت جواب را ارسال كرد جواب به سرور نميرسه( هر دو به علت پكت لاست )
سرور بيشعرو ميزنه همه چيزا به هم :)

خب حالا چه راه حلي براي اين داستان داريد ؟

يك نمونه پكت هاي رد و بدل شده را ميزارم ( با وايرشارك كپچر شده )
5 پكت آخر بعد از ديسكانتي از سمت كلاينت همچنان در حال ارسال بودند.
آي پي 192.168.1.103 سرور بازي بوده
آي پي 2.146.226.197 كلاينت بازي بوده

صفحه‌ها: 1 2