C ++ برمجة الشبكة غير المتزامنة
-
28-09-2019 - |
سؤال
لدي بعض الأسئلة البسيطة ، ولدي تطبيق خادم عميل وبيانات مرسلة على السلك.
أود أن أكون قادرًا على استعادة البيانات والتعامل معها بشكل صحيح.
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 إضافي ، أو تكرار العملية حتى يكون لديك بايت أو يموت شيء ما.
لست متأكدًا مما تقصده ، "غير قادر على قراءة كل شيء". تتبادر إلى الذهن معنيان محتملان:
- لا تملأ كمية البيانات المتاحة للقراءة بنية. في هذه الحالة ، يمكنك ببساطة القيام بـ Read_async آخر لانتظار وصول المزيد من البيانات.
- الهيكل لا يمتص كل تلك البيانات التي وصلت. ستقوم مكدس TCP ببساطة بتخزين البيانات غير المقروءة حتى تتجول في قراءتها.