PDA

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



iman_Delphi7
یک شنبه 19 خرداد 1387, 07:18 صبح
با سلام
من دارو یه برنامه با ClientSocket و ServerSocket می نویسم که چند تا کلاینت به سرور متصل می شن.
این کلاینتها مشخصاتشون تو یک لیست قرار می کیره. در این لیست :
ServerSocket1.Socket.Connections
که تعداد کلاینتهای متصل هم از : ServerSocket1.Socket.ActiveConnections بدست می آد.
وقتی کلاینتی Disconnect بشه رویداد OnClientDisconnect در سرور اجرا می شه.
می خواستم بدونم چطور میشه فهمید کدوم کلاینت DC شده. یعنی چطور می تونم اندیس کلاینتی که DC شده رو تو همون لیست سرور که عرض کردم بدست بیارم.
ممنون می شم اگه راهنماییم کنین.
با تشکر قبلی.

iman_Delphi7
یک شنبه 19 خرداد 1387, 17:37 عصر
از دوستان کسی نمی تونه کمکم کنه؟؟
ممنون می شم اگه راهنماییم کنید.

iman_Delphi7
دوشنبه 20 خرداد 1387, 02:49 صبح
پس اجازه بدین خودم شروع کنم
یه راهش اینه که Client موقع DC شدن یه پیغام به سرور بفرسته و در آخر پیغام فرضا IP خودشو بفرسته.




Disconnect' + Client_IP_Address + #0 // Disconnect192.168.2.12'

وقتی سرور این پیغام و میبینه ، IP فرستاده شده رو که در انتهای پیام هست می گیره و در لیست خودش دنبال این IP می گرده و هر جا این IP رو دید همون اندیس رو بر می گردونه.



Var
;Data : String
;PreCode : String
;IP : String


Begin
;Data := Socket.RecieveText
;(Command := Copy(Data,1,10


If Command ='Disconnect' Then
Begin
;(IP := Copy(Data,11,15
For i:=0 To ServerSocket1.Socket.ActiveConnections -1 Do
If ServerSocket1.Socket.Connections[i].RemoteAddress = IP Then
Begin
DC_Index := i; //This is The answer
;Break
;End
;End
;End


این کد رو تو OnClientDisconnect در ServerSocket1 مینویسیم.
ولی مشکل این روش اینه که فقط در صورتی درست کار می کنه که کلاینت موفق بشه این پیغام رو بفرسته. حالا اگه کلاینت به هر دلیلی موفق نشه این پیغاو بفرسته، سرور هم نمی تونه اندیس کلاینتی که DC شده رو بدست بیاره.
مثلا اگه کامپیوتر کلاینت بصورت ناگهانی Reset یا خاموش بشه.

اگه از اساتید محترم کسی می دونه اینو باید چیکارش کنیم ممنون می شم راهنمایی کنه.

aserfg
دوشنبه 20 خرداد 1387, 14:22 عصر
سلام دوست گرامي من با اين دو كامپوننت زياد آشنا نيستم ولي يه سؤال داشتم چرا با ايندي كار نمي كني به عقيده من خيلي مي تونه كارت رو راحت كنه مثلا براي همين مشكلي كه داري يه خط كد كافي بود و نيازي نبود كلاينت به سرور چيزي ارسال كنه و اصلا كار جالبي نيست.

iman_Delphi7
جمعه 24 خرداد 1387, 09:49 صبح
سلام. می دونم خیلی راحت تره. آخه تعریف پروژه اینه که با این کامپوننت ها نوشته بشه. وگرنه همین برنامه رو من خودم با TCPServer و TCPClient از سربرگ Indy نوشتم.