كيف تحدد بشكل صحيح أنه تم الوصول إلى نهاية المدخل في QTCPSOCKET؟

StackOverflow https://stackoverflow.com/questions/4029802

  •  26-09-2019
  •  | 
  •  

سؤال

لدي الرمز التالي الذي يقرأ من QTCPSOCKET:

QString request;

while(pSocket->waitForReadyRead())
{
    request.append(pSocket->readAll());
}

المشكلة في هذا الرمز هي أنه يقرأ جميع المدخلات ثم يتوقف مؤقتًا في النهاية لمدة 30 ثانية. (وهي المهلة الافتراضية.)

ما هي الطريقة الصحيحة لتجنب القوات الطويلة والكشف عن أن نهاية المدخلات قد تم الوصول إليها؟ (إن الإجابة التي تتجنب الإشارات مفضلة لأن هذا من المفترض أن يحدث بشكل متزامن في خيط.)

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

المحلول

الطريقة الوحيدة للتأكد من ذلك هي عندما تتلقى العدد الدقيق للبايتات التي تتوقعها. يتم ذلك عادة عن طريق إرسال حجم البيانات في بداية حزمة البيانات. اقرأ ذلك أولاً ثم استمر في الحلق حتى تحصل على كل شيء. البديل هو استخدام Sentinel ، وهي سلسلة محددة من البايتات التي تمثل نهاية البيانات ولكن هذا عادة ما يصبح فوضويًا.

نصائح أخرى

إذا كنت تتعامل مع موقف مثل استجابة HTTP التي لا تحتوي على طول محتوى ، وأنت تعلم أن الطرف الآخر سيغلق الاتصال بمجرد إرسال البيانات ، هناك حل بديل.

  1. استخدم socket.setReadBuffersize للتأكد من وجود ما يكفي من المخزن المؤقت للقراءة لجميع البيانات التي قد يتم إرسالها.
  2. استدعاء socket.waitfordisconnection لانتظار الطرف البعيد لإغلاق الاتصال
  3. استخدم socket.bytesavail

هذا يعمل لأن إغلاق الاتصال لا يتجاهل أي بيانات مخزنة في QTCPSOCKET.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top