Python Socket.recv/Sendall Call منع
سؤال
يتم وضع علامة على هذا المنشور بشكل غير صحيح "إرسال" حيث لا يمكنني إنشاء علامات جديدة.
لدي سؤال أساسي للغاية حول خادم الصدى البسيط هذا. فيما يلي بعض قصاصات التعليمات البرمجية.
زبون
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()
, ، وبالتالي يتم حظر كلتا العمليتين.