سؤال

يتم وضع علامة على هذا المنشور بشكل غير صحيح "إرسال" حيث لا يمكنني إنشاء علامات جديدة.

لدي سؤال أساسي للغاية حول خادم الصدى البسيط هذا. فيما يلي بعض قصاصات التعليمات البرمجية.

زبون

while True:
 data = raw_input("Enter data: ")
 mySock.sendall(data)
 echoedData = mySock.recv(1024)
 if not echoedData: break
 print echoedData

الخادم

while True:
 print "Waiting for connection"
 (clientSock, address) = serverSock.accept()
 print "Entering read loop"
 while True:
     print "Waiting for data"
     data = clientSock.recv(1024)
     if not data: break
     clientSock.send(data)
 clientSock.close()

الآن هذا يعمل بشكل جيد ، إلا عندما يرسل العميل سلسلة فارغة (عن طريق الضغط على مفتاح الإرجاع استجابةً لـ "Enter Data:") ، وفي هذه الحالة أرى بعض سلوك Deadlock-ish.

الآن ، ماذا يحدث بالضبط عندما يضغط المستخدم على عودة إلى جانب العميل؟ لا يسعني إلا أن أتخيل أن كتل المكالمات Sendall في انتظار إضافة بعض البيانات إلى المخزن المؤقت للإرسال ، مما تسبب في حظر استدعاء RECV بدوره. ماذا يحدث هنا؟

شكرا للقراءة!

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

المحلول

أكثر مثل ، sendall() لا تفعل المكالمة شيئًا (نظرًا لعدم وجود بيانات لإرسالها) ، وبالتالي recv() استدعاء على زبون كتل في انتظار البيانات ، ولكن بما أنه لم يتم إرسال أي شيء إلى الخادم ، فإن الخادم لا يرسل أبدًا أي بيانات لأنه تم حظره أيضًا في أولي recv(), ، وبالتالي يتم حظر كلتا العمليتين.

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