سؤال

لدي بعض الأسئلة البسيطة ، ولدي تطبيق خادم عميل وبيانات مرسلة على السلك.

أود أن أكون قادرًا على استعادة البيانات والتعامل معها بشكل صحيح.

struct T1
{
   int id;
   int foo;
};

struct T2
{
  int id;
  char foo;
  int bar;
};

دعنا نأخذ هذه الهياكل ، يتم إرسالها على الشبكة مسبقة بـ INT والتي ستعرف ما إذا كان T1 أو T2 يتبع. إذا أرسل لي العميل T1 ، فسترسل لي T2 ، فهل لدي التأكيد على أنه يمكنني قراءة بنية كاملة مع ASIO :: IP :: TCP :: Socket.async_read ()؟ أرغب في إعداد معالج سيتعامل مع بنية واحدة ، ولكن ماذا سيحدث إذا لم أتمكن من قراءة كل شيء في Async_read ()؟

ستستمر العملية غير المتزامنة حتى تكون إحدى الشروط التالية صحيحة:

  • المخازن المؤقتة الموردة ممتلئة. أي أن البايتات المنقولة تساوي مجموع أحجام المخزن المؤقت.
  • حدث خطأ.

هل ستتجاهل البيانات التي لا يمكن قراءتها؟ هل سيؤدي إلى async_read آخر؟ وهل أكدت أن ASYNC_READ لن يحصل على بنية معرف+واحدة فقط إذا أرسل لي موكلي هيكل المعرف+بالتتابع؟ أو قد يقوم نظام التشغيل بتحسين الأشياء ويضعها في نفس paquet؟ كما رأيت ، أنا مرتبك قليلاً ، أود اتخاذ القرارات الصحيحة عند تصميم تطبيق خادم/عميل ، سيتم تقدير أي مساعدة.

شكرًا لك.

هل كانت مفيدة؟

المحلول

تحرير: بفضل Timo للإشارة إلى خطأ. لن يكتمل ASYNC_READ حتى تتم قراءة البنية بأكملها ، لذلك لا تحتاج إلى حلقة. خلاف ذلك ، جوابي هو نفسه. لن يتم فقد أي شيء ، بغض النظر عن كيفية تفكك بروتوكول TCP أو يجمع البيانات.

إذا لم يكن هناك بيانات كافية في المخازن المؤقتة TCP لملء المخزن المؤقت للإدخال ، فستجلب القراءة ببساطة كل ما هو متاح ، والإبلاغ عن عدد البايتات التي تم جلبها. ما سيحصل لاحقا سيكون عائدا لك. قد يكون لديك ما يكفي من البيانات في بايت جلبت لتقرر أنك لا تريد المتابعة ، لذلك لا تقدم ASIO أي افتراضات. إذا لم تكن قد قرأت ما يكفي من البايتات لتتضمن بنية كاملة ، فقم بتشغيل ASYNC_READ إضافي ، أو تكرار العملية حتى يكون لديك بايت أو يموت شيء ما.

لست متأكدًا مما تقصده ، "غير قادر على قراءة كل شيء". تتبادر إلى الذهن معنيان محتملان:

  1. لا تملأ كمية البيانات المتاحة للقراءة بنية. في هذه الحالة ، يمكنك ببساطة القيام بـ Read_async آخر لانتظار وصول المزيد من البيانات.
  2. الهيكل لا يمتص كل تلك البيانات التي وصلت. ستقوم مكدس TCP ببساطة بتخزين البيانات غير المقروءة حتى تتجول في قراءتها.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top