سؤال

لدي تطبيق يستخدم ioctl(FIONREAD) لتحديد عدد الثماني بتات المعلقة في Raw المقبس الذي يستقبل المخزن المؤقت في Linux ثم يتصل بـ recv على ذلك.

قرأت في مكان ما أن واجهة ioctl للمآخذ الأولية في Linux لا تُرجع فعليًا الثمانيات المعلقة الفعلية.هل هذا صحيح؟

أنا أسأل لأنني أفقد بعض الرسائل بين الحين والآخر بسبب الأحمال العالية ولم أتمكن حتى الآن من معرفة مكانها.هل هي طريقة أفضل لمعرفة عدد الثماني بتات المعلقة في مقبس Raw.

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

المحلول

هناك دائمًا احتمال أن تقوم النواة بإسقاط الحزم إذا كان تطبيقك غير قادر على مواكبة معدل الحزم (نظرًا لأن المخزن المؤقت للنواة ليس غير محدود).

راجع للشغل، لماذا تحتاج إلى معرفة عدد الثمانيات على أي حال؟نظرًا لأن هذه مآخذ توصيل حزم، فإن طول الحزمة سيكون دائمًا محدودًا بالحد الأقصى لحجم الإطار لواجهة الشبكة، لذا قم فقط بتمرير مخزن مؤقت كبير بما يكفي لrecv.

بعد قولي هذا، إذا كان الأداء أمرًا بالغ الأهمية، فيجب عليك النظر فيه PACKET_MMAP الدعم على لينكس.

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