سؤال

لدي خادم مقبس أحاول الانتقال إلى SSL على Python 2.5، لكنني أركض في عقبة مع pyopenssl. لا يمكنني العثور على أي برامج تعليمية جيدة حول استخدامها، لذلك أنا أعمل إلى حد كبير على التخمينات.

هنا كيف يقوم خادمي بإعداد المقبس:

ctx = SSL.Context(SSL.SSLv23_METHOD)
ctx.use_privatekey_file ("mykey.pem")
ctx.use_certificate_file("mycert.pem")
sock = SSL.Connection(ctx, socket.socket(socket.AF_INET, socket.SOCK_STREAM))
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
addr = ('', int(8081))
sock.bind(addr)
sock.listen(5)

هنا كيف تقبل العملاء:

sock.setblocking(0)
while True:
  if len(select([sock], [], [], 0.25)[0]):
    client_sock, client_addr = sock.accept()
    client = ClientGen(client_sock)

وهنا كيف يرسل / يتلقى من مآخذ الاتصال:

while True:
  (r, w, e) = select.select([sock], [sock], [], 0.25)

  if len(r):
    bytes = sock.recv(1024)
  if len(w):
    n_bytes = sock.send(self.message)

انها مضمنة، ولكن تحصل على الفكرة العامة. المشكلة هي، بمجرد أن تبدأ حلقة الإرسال / التلقي، فاتبع على الفور، قبل إرسال أي شيء أو استلامه (يمكنني أن أرى على أي حال):

Traceback (most recent call last):
  File "ClientGen.py", line 50, in networkLoop
    n_bytes = sock.send(self.message
WantReadError

وصف الدليل ل "Wantreaderror" غامضة للغاية، قائلا إنه يمكن أن يأتي من أي مكان تقريبا. ما الخطأ الذي افعله؟

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

المحلول

في بعض الأحيان من أجل إرسال بايت التطبيقات من اتصال SSL، يجب أن تكون قادرا على قراءة المزيد من البايتات من الاتصال أولا. WantReadError هو كيف يتم الإشارة إلى هذه الحالة. الشيء الوحيد الذي تفعله خطأ هو أنك لا تعامل WantReadError ثم انتظر حتى select يشير إلى أن المقبس هو قابل للقراءة قبل محاولة الاتصال send تكرارا.

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