PDA

View Full Version : سوال: بسته شدن برنامه طرف سرور



reza_program
سه شنبه 09 شهریور 1389, 10:33 صبح
سلام
من یه برنامه کلاینت/سرور دارم

خیلی خوب اطلاعات رو رد بدل مبکنه

ولی زمانی که سمت کلاینت ارتباط رو قطع میکنه

سمت سرور بسته میشه و از خظ زیر ارور میگیره(عکس ضمیمه):




if (client.Connected)
{
ns.Read(Recvbyte, 0, client.ReceiveBufferSize);


حتا قبلش بررسی کردنم که اگه ارتباط برقرار بود بیا این کارو انجام بده
ولی مشکلم حل نشد!

ربطی به نسخه دات نت نداره؟

از سی شارپ 2008 و دات نت 3.5 سرویس پک 1 استفاده میکنم!

ممنون میشم راهنمایی کنید!

BILLY_Mgs
سه شنبه 09 شهریور 1389, 12:27 عصر
از یه Try , catch نمیشه استفاده کرد؟

C Sharp
سه شنبه 09 شهریور 1389, 17:28 عصر
وقتی یه طرف ارتباط TCP، ازتباطش رو میخواد قطع کنه ، قبلش یه پیغام به طرف مقابل میده و بعد هر دو منتظر میمونن تا ارتباط بطور کامل قطع بشه ، واسه همین تا زمانی که این عمل بطور کامل صورت نگیره ، همچنان Socket تو وضعیت Connected هست.

واسه دیدن عینی این مسئله میتونید تو CMD دستور netstat رو بزنید ، بعد یک سایت رو تو مرورگر لود کنید و بلافاصله تو CMD دوباره دستور netstat رو وارد کنید

وضیعت سوکت موقع ارتباط Established، موقع قطع شدن Fin_Wait و بعد Time_Wait هست

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

reza_program
چهارشنبه 10 شهریور 1389, 13:12 عصر
ممنون از جوابتون

پس باید حتما دستور

Client.Close()

صادر بشه تا سوکت قطع شده و گرنه همچنان سوکت وصله.

:تشویق:

C Sharp
چهارشنبه 10 شهریور 1389, 13:14 عصر
نه وقتی Close زو فراخوانی میکنین بازم یه مدت زمانی طول میکشه تا بطور کامل قطع بشه
وصل هست ولی نه به این معنا که میشه چیزی فرستاد یا دریافت کرد

cheshm6k
چهارشنبه 10 شهریور 1389, 13:31 عصر
سلام.
میتونید قبل از بستن پورت از طرف کلاینت یه پیغام به سرور بفرستید. یه پیغام قراردادی ، هرچی که میخوای . بعد سمت سرور چک کن اگه اون پیغام بود ارتباط رو قطع کنه . اینطوری هم دستور Read کارش تموم میشه و میاد خط بعد ، هم شما متوجه قطع ارتباط میشی