PDA

View Full Version : سوال: برنامه کلاینت سرور با تعداد کلاینت بالا



alux
دوشنبه 20 مهر 1394, 18:06 عصر
سلام

دوستان من یه برنامه نوشتم بصورت کلاینت / سرور

که تقریبا شبیه نرم افزار چت هست

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


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

ولی وقتی تعداد کانکشن ها بالا می ره به نظر می رسه سرور نمی تونه همه کانکشن ها را هندل کنه و بعضی از اونها از دست می رن

مثلا من از یک کلاینت 100 تا پکت می فرستم ولی سرور فقط 93 تا دریافت می کنه و 7 تا رو اصلا نمی بینه

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

من دنبال راه حل های پیشنهادی هستم

مثلا برنامه ای مشابه وایبر یا تلگرام چطور این حجم از کانکشن ها را هندل می کنند

با تشکر

pbm_soy
دوشنبه 20 مهر 1394, 19:17 عصر
درستش هم اینه که با c/c++ بنویسید بخاطر سرعتش و قدرتش
ولی مشکل شما بیشتر به الگوریتم کاریتون بستگی دارد بهتر بود کد را اینجا میگذاشتید! تا روش تکراری را نگیم و یا روش بهتری نسبت به کد شما بگیم!
آیا برنامه را multi thread نوشتید؟ بهتر است برنامه را یعنی بخشی که هر کانکشن را جواب میدهد باید در یک ترد جداگانه باشد یعنی هر کانکشن که درخواست اتصالش میرسه به برنامه سرور باید یک ترد جدید باز کنید یعنی برای هرکانکشن یک ترد جدا اگر ۱۰۰نفر وصل شوند باید صدتا ترد داشته باشید وهمچنین مدیریت تردها خیلی مهم است باید روی این زمینه هم خوب باید اینکار را انجام دهید
میزان ram و cpu سرور نیز مانیتور کنید که آیا همچین پردازش هایی را سرور میتواند اجرا کنید و یا کم میاورد ؟
همینطور برای همچین برنامه هایی نوشتن لاگ فایل مهم است و تک تک عملیات سرور را در هر مرحله تو فایل متنی ثبت کنید
آیا برای تبادل دیتا پروتکل تعریف کردید یا اینکه همینطوری مستقیم رشته ای را ارسال میکنید؟

negative60
سه شنبه 21 مهر 1394, 08:14 صبح
اگه از SELECT برای مديريت سوکت ها استفاده کرديد بايد بگم که اين روش محدوديت داره بهتره از روش های ديگه استفاده کنيد
اگر برنامه سمت سرور برای لينوکس طراحی شده بهترين گزينه استفاده از epoll هست اگر هم برنامه سمت سرور روی ويندوز هست بهترين روش I/O Completion Ports socket هست .
از روش مالتی ترد هم ميتونيد برای مديريت چندين هزار سوکت همزمان استفاده کنيد اما اين روش مصرف CPU و رم بيشتری نسبت به روش های قبلی داره



اينکه پکت های شما ارسال نميشن يا ناقص ارسال ميشن کاملاً بستگی به نحوه ارسال ديتا بين سرور کلاينت داره, در TCP وقتی چندين پکت همزمان پشت سر هم ارسال ميشن پکت ها ممکنه شکسته بشن يا با هم ادغام بشن بهتره از يک فرمت يا پروتکل استاندارد استفاده کنيد يا اينکه خودتون ابداع کنيد