View Full Version : قطع ارتباط کلاینت ها با سرور
daniyal_1363
چهارشنبه 09 فروردین 1391, 11:17 صبح
سلام
سال نوی همه مبارک
برای ارتباط کلاینت با سرور از کامپونت Winsock استفاده کردم و برای چندین ارتباط از طریق یک Winsock لیسن میکنم و با یک Winsock که از نوع آرایه هست درخواست هایی که از کلاینت ها میشه رو Accept میکنم
مشکلم اینجاست که وقتی من نرم افزار سرور یک بار باز می کنم تمامی سیستم ها متصل میشن ولی اگه نرم افزار رو ببندم و دوباره باز کنم تمامی سیستم ها به سیستم سرور وصل نمیشن !!!!!
توضیح :
نرم افزار کلاینت یک تایمر داره که در صورت قطع ارتباط هر 1 ثانبه چک میکنه و سعی میکنه که به سرور متصل بشه
یه راه اصولی و دقیق میخوام که در هر صورتی ( یعنی اگر : نرم افزار سرور بسته بشه یا در حین کار ریستار بشه - سیستم کلاینت بسته بشه یا ریستار بشه ) بعد از اجرای مجدد هر کدوم ( چه سرور و چه کلاینت ) سیستم های کلاینت در سرور نمایش داده بشه
اگه میشه راهتون رو تست کنید و با نمونه راهنمایی کنین
بازم ممنون:بوس:
M.T.P
چهارشنبه 09 فروردین 1391, 12:42 عصر
سلام
این سابروتین رو هر 10 ثانیه یکبار با تایمر صدا بزنید ، مشکلتون برطرف میشه.
به جای wskClient هم اسم وینسوک خودتون رو بگزارید.
به جای strIP و intPort هم متغیرهای آی پی و پورت رو بگزارید.
Sub ConnectToServer()
With wskClient
If .State <> sckConnected And .State <> sckConnecting Then
.Close
.Connect strIP, intPort
End If
End With
End Sub
M.T.P
چهارشنبه 09 فروردین 1391, 12:49 عصر
البته یه چیز مهم که باید در نظر داشته باشید ، حالت ارتباط بصورت مرده ست که این حالت زمانی پیش میاد که سرور بصورت غیرمعمول بسته شه (برق رفتن یا End Proccess)، در این حالت با اینکه عملا ارتباط قطع هست اما سمت کلاینت همچنان ارتباط رو برقرار می دونه و برای رفع این مشکل باید وینسوک ها چه از سمت سرور و چه از سمت کلاینت هر 10 الی 15 ثانیه یکبار یک دیتا و لو اینکه یک کاراکتر باشه بهم ارسال کنند که با این حال اگر ارتباط مرده باشه بعد از 20 ثانیه سوکت خود به خود close میشه.
daniyal_1363
دوشنبه 14 فروردین 1391, 22:02 عصر
سلام
من متوجه شدم که بعضی از Wisock های سیستم ها در حالت sckConnecting میمونه ، در این حالت نمیشه پیغام فرستاد و یا دریافت کرد - چه جوری این مشکل رو حل کنم ؟
ناگفته نمونه که چندین بار Winsock مورد نظر رو Close کردم و اصلاً نرم افزار رو بستم و دوباره باز کردم ولی باز هم این مشکل هست فقط در صورتی مشکلم حل میشه که سیستم رو ریستار یا لاگاف کنم
M.T.P
سه شنبه 15 فروردین 1391, 00:40 صبح
سلام
پست شماره 2 رو اصلاح کردم بجای AND کلیدواژه OR گذاشته بودم.
و اما مشکلتون به پیاده سازی ارسال Ping صد در صد حل میشه.
روال زیر رو هر 10 ثانیه یکبار صدا بزنید. (هم از سمت سرور و هم کلاینت)
Sub Ping()
With winsock1
If .State = sckConnected Then .SendData "<PING>"
End With
End Sub
سوکت های سمت سرور رو چطوری مدیریت می کنید؟
وقتی یک کلاینت رو می بندید و سوکت مربوطه در سرور بسته میشه ، برای ارتباط مجددش در سرور با همون سوکت ارتباطش رو برقرار می کنید یا همیطور آرایه جدید میسازید؟
daniyal_1363
سه شنبه 15 فروردین 1391, 07:56 صبح
راستش از دو روش استفاده کردم ولی نمیدونم کدوم بهتره
روش اولم : اینکه زمان درخواست از طرف کلاینت بین آرایه ها چک میکردم هر کدوم از Winsock ها که State برابر با sckClosed و یا sckClosing می بود سوکت Closed و درخواست جدید با اون Accept میکردم - یعنی به تعداد سیستم هام سوکت داشتم
روش دومم : برای هر درخواست جدید یک Winsock رو Load میکردم و درخواست رو با همون Accept میکردم
daniyal_1363
سه شنبه 15 فروردین 1391, 08:10 صبح
تمامی تست هایی که میخوام انجام بدم اول روی این نمونه (Client و Server) که ضمیمه کردم انجام میدم و بعد روی نرم افزار اصلیم پیاده میکنم
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.