PDA

View Full Version : جلوگیری از بسته شدن سوکت در اتصال با boost در c++



mosi20
دوشنبه 29 آبان 1396, 15:36 عصر
سلام
من به یک سروری با boost وصل شدم و در حال دریافت اطلاعات هستم
ولی مرتبا در async_read ارور end off file میگیرم و قطع میشوم
این اتفاق زمانی میوفته که بین ۱ الی ۲ دقیقه هیچ اطلاعاتی از سمت سرور به من داده نشود
در صورتی که مطمئنم سرور اون طرف من را قطع نکرده است
برای اینکه بتونم از این قطع شدن جلوگیری کنم باید چیکار کنم؟



boost::asio::async_read(socket_, boost::asio::buffer(header_buffer , 4 ),
boost::bind(&uap_client::handle_read_header, this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred)
);

m.r226
سه شنبه 30 آبان 1396, 23:00 عصر
خطای boost::asio::error::eof از اسمش معلومه که چی میگه!

از دستور boost::asio::async_read وقتی استفاده میشه که شما میخوای به شکل غیرهمزمان مقداری بایت رو از یک جریان یا استریم بخونی
وقتی اون جریان یا استریم به انتهای خودش برسه، این خطا که به منزله ی پایان کار هست میاد.

جرانی که از سمت سرور میاد، منبعش یه فایله حتما که وقتی تموم میشه ارسالش این رو چاپ میکنه

mosi20
چهارشنبه 01 آذر 1396, 08:48 صبح
ببخشید مشکل اینه که فایل نیست
ما داریم در این ارتباط تبادل اطلاعات میکنیم
اطلاعات هم خوب یه موقع هست و یه موقع نیست
یعنی وقتی نیست من باید صبر کنم تا اطلاعات جدید بیاد برام
حالا ممکنه ۱۰ دقیقه طول بکشه

m.r226
یک شنبه 05 آذر 1396, 21:49 عصر
یه حلقه بی انها بزارید که کانکشن رو بعد از پرتاب استثناء دوباره بر قرار کنه.
از سیگگنال هم میتونین برای خاتمه دادن به حلقه استفاده کنید

mosi20
دوشنبه 06 آذر 1396, 10:03 صبح
خوب یه مشکلی داریم برای اینکار
چون بعد از بار اتصال باید لاگین کنیم تمام اطلاعات قبلی میپره
برای اون راه کاری ندارید ؟

m.r226
دوشنبه 06 آذر 1396, 22:15 عصر
تو کدی که گذاشتید لاگ این وجود نداره!
من همون تیکه کد رو گفتم
اگر فرآیند کلی رو یه بار توضیح بدین ممنون میشم

mosi20
دوشنبه 06 آذر 1396, 22:34 عصر
همینه فرآیند
ما متصل میشیم به یه آی پی و پورت
بعد اطلاعات لوگین را میفرستیم
بهمون یه جواب میده
بعد ما صبر میکنیم اون اطلاعات بفرسته و ما بهش با توجه به اطلاعاتی که اون میده بهش یه جوابی میدیم
حالا این وسط اگه ۱-۲ دقیقه اطلاعاتی رد و بدل نشه سوکت قطع میشه

m.r226
سه شنبه 07 آذر 1396, 00:22 صبح
ماشاالله سوالتو تو استک هم پرسیدی :قهقهه:

خوبه، به هر حال حلش می کنیم ایشالله.
به نظرم باید متدت رو عوض کنی، قطعا فرآیند لاگ این دستی نیست و اینکه boost::asio::async_read هم عوض بشو نیست!
شما به سرور میگی از یه استریمت بهم اطلاعات بده، سرور اطلاعات رو میفرسته و تمام میشه کار. خوب قطعا قرار نیست برای کاری که تموم شده کانکشنش رو باز بزاره


کانکشن دائم وجود نداره، هر کانکشنی پایانی داره. مثلا وقتی با کاربر روت تو ترمینال وارد میشی، تا وقتی که ترمینال رو نبندی روت هستی ولی همینکه ترمینال رو ببندی دوباره باید لاگین کنی

شما داری اطلاعات رو درخواست میدی و میخونی، سرورم جواب میده. ذات کانکشنت همین قدر عمر داره.

mosi20
سه شنبه 07 آذر 1396, 09:38 صبح
خوب میدونی خیلی فورس و مهم هست و هرچیم سرچ کردم چیزی پیدا نکردم
دنبال این هستم که مطمئن بشم جایی از کار را اشتباه نرفتم
موقتا برای اینکه سوکت بسته نشه هر ۳۰ ثانیه یک اطلاعات بیخودی میفرستم و اینجوری ۱-۲ روز ارتباط قطع نمیشه اما در نهایت باز هم بعد از ۱-۲ روز قطع میشه دقیقا با همون ارور end off file