روبي TCPSocket recv حجب أبدا العودة
-
24-09-2019 - |
سؤال
لدي التعليمة البرمجية التالية:
def LSCPHandler.send_message(message, hostname, port)
s = TCPSocket.open(hostname, port)
s.print message
ret = s.recv(1024)
s.close
LSCPHandler.parse_error(ret)
return ret
نهاية
الذي يعمل على ما يرام ، عادة.الخادم أنا أتحدث إلى إرجاع استجابة بسرعة كبيرة, عادة, و كل شيء على ما يرام.
ثم, اليوم, حدث خطأ في الخادم.ليست مشكلتي, ولكن هذا أدى بي الى تطبيق كامل معلقة في انتظار recv إلى الوقت.هذا ليس الأمثل.
هل هناك طريقة الوقت recv إذا أنا لا أسمع شيئا مرة أخرى على الفور ؟ حاولت أبحث في روبي الوثائق ، لكنها في الحقيقة يحيرني(أيTCPSocket إلا بتنفيذ ثلاثة طرق لا أحد منهم فتح أو recv و هو الوالد فئة من مأخذ لا implemente هذه الأساليب أيضا.ومأخذ الأم الطبقة يبدو أن الكائن ؟ أنا شاملة الخلط)
المحلول
يمكنك ضبط مهلة تلقي مأخذ الخيارات على المقبس إلى شيء آخر غير الافتراضي.صعبة بعض الشيء هو اختيار عدد مناسب من أن لا تزال تعمل في جميع حالات الاستخدام ، أيكنت لا تريد الخاص بك recv
استدعاء المهلة في وقت مبكر جدا.
s.setsockopt(Socket::SOL_SOCKET, Socket::SO_RCVTIMEO, <timeout>)