هل من الطبيعي أن تفشل WSASEND أثناء عمليات نقل الملفات الكبيرة؟

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

  •  03-10-2019
  •  | 
  •  

سؤال

أحتاج إلى القليل من المساعدة إذا حصل شخص ما على دقيقة. لقد كتبت خادم ويب باستخدام منافذ إتمام IO ، لكنني أواجه بعض المشاكل في إرسال الملفات الكبيرة. يبدو أن صفحات الويب تعمل بشكل جيد ، ولكن خلال عمليات نقل الملفات الكبيرة ، تفشل WSASEND () بعد بضع دقائق مع خطأ "اسم الشبكة المحدد لم يعد متاحًا".

في الوقت الحالي ، يقوم الخادم الخاص بي بإغلاق الاتصال المرتبط به عند فشل أي عملية متداخلة. هل هذا هو الشيء الصحيح الذي ينبغي عمله؟ أم هل يجب أن أخفق في إعادة تداخل العمليات عدة مرات قبل أن أغلق المقبس؟ أنا أستخدم مآخذ TCP/Stream.

(ثابت) أتلقى أيضًا ما يبدو وكأنه حزم بايت عشوائية من WSARECV. لست متأكدًا مما يجب صنعه من هذا ، أو إذا كانت المشكلة مرتبطة. (/ثابت)

شكرا على اي مساعدة

تحرير: الآن بعد أن يعالج الخادم الاتصالات بشكل صحيح ، ولديه سجل أكثر شمولاً ، يبدو أن لين على حق. يقوم العميل بإغلاق الاتصال لسبب ما.

السجل:

Initializing Windows Sockets...
Forwarding port 80...
Starting server...
Waiting for incoming connections...
Socket 1128: Client connected.
Socket 1128: Request received
Socket 1128: Sent response
Socket 1128: Error 64: SendChunk() failed. //WSASend()
Socket 1128: Closing connection - GetQueueCompletionStatus == FALSE

لذا فإن السؤال الآن ، لماذا يغلق العميل الاتصال؟ يستغرق الحدوث من 2 إلى 5 دقائق. لقد خفضت حجم المخزن المؤقت إلى 4098 بايت لكل إرسال ، وأرسل الجزء التالي فقط عند الانتهاء من الأول.

شكرا مرة أخرى على أي أفكار حول هذا.

ملاحظة: لقد قمت فقط بتطبيق وظيفة إعادة المحاولة بحيث ستقوم بإعادة إعادة تشغيل عملية IO متداخلة فاشلة خمس مرات قبل الاستسلام .... لا يوجد محظوظ = (

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

المحلول 3

وأخيرا برزت عليه.

من شروط الخدمة على الإنترنت في روجرز:

بدون قيود ، لا يجوز لك استخدام (أو السماح لأي شخص آخر باستخدام) خدماتنا إلى:

(XVI) قم بتشغيل خادم فيما يتعلق بالخدمات ، بما في ذلك ، على سبيل المثال لا الحصر ،> البريد أو الأخبار أو الملف أو gopher أو telnet أو الدردشة أو الويب أو خوادم تكوين المضيف أو الوسائط المتعددة> اللافتات أو المنتديات التفاعلية متعددة المستخدمين ؛

ما مدى عرجاء ذلك؟ O_O

أخبار جيدة: الخادم يعمل بشكل جيد =)

تحرير- دعا روجرز. لقد تحققوا من أنهم يقطعونني ، وأخبروني أنني بحاجة إلى حساب تجاري لتشغيل خادم ويب.

نصائح أخرى

تم إرجاع حزمة ذات طول صفر من recv يشير العميل على الطرف الآخر إلى إغلاق الاتصال.
ما الذي يجيب لماذا الخاص بك اللاحق send إلى العميل فشل.

http://www.opengroup.org/onlinepubs/009695399/functions/recv.html

إذا لم تكن هناك رسائل متاحة لتلقيها وأجرى الأقران إغلاقًا منظمًا ، يجب إرجاع RECV () 0.

هل تفعل أي شيء لفرض شكل من أشكال التحكم في التدفق على نقل البيانات الخاص بك؟

إذا لم يكن الأمر كذلك ، فمن المحتمل أنك تستخدم الموارد التي تسبب فشل الإرسال.

على سبيل المثال ، إذا كنت ببساطة تصدر الكثير من WSASend() يستدعي واحدة تلو الأخرى بدلاً من وضعها بناءً على وقت اكتمالها ، فسيستخدم كل واحد موارد النظام (تجمعات و/أو قفل غير مجمعة تتجه نحو "الحد الأدنى للصفحات المقفلة"). من المحتمل أن تفشل في النهاية مع ENOBUFS أو أخطاء مماثلة.

ما عليك القيام به هو إنشاء نظام تحكم في التدفق يعمل خارج إكمال إرسال حتى لا يكون لديك سوى عدد معروف من الإرسالات المعلقة في كل مرة.

انظر هذه الأسئلة لمزيد من التفاصيل:

قم بتنفيذ قائمة انتظار جيدة الأداء مع TCP

يحد من TCP يرسل مع قائمة انتظار "للوصول" وقضايا التصميم الأخرى

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