SocketServer.TheradingTcpserver - لا يمكن ربط العنوان بعد إعادة تشغيل البرنامج

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

سؤال

كمتابعة ل لا يمكن أن ترتكز على الالتصاق-بعد توصيل المخطط, ، كنت أتلقى هذا الخطأ بعد إعادة تشغيل برنامجي:

Socket.error: [Errno 98] عنوان مستخدم بالفعل

في هذه الحالة بالذات ، بدلاً من استخدام مقبس مباشرة ، يبدأ البرنامج خادم TCP الخاص به:

httpd = SocketServer.ThreadingTCPServer(('localhost', port), CustomHandler)
httpd.serve_forever()

كيف يمكنني إصلاح رسالة الخطأ هذه؟

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

المحلول 2

في هذه الحالة بالذات ، .setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) قد يتم استدعاؤه من فئة TCPServer عندما allow_reuse_address تم تعيين الخيار. لذلك تمكنت من حلها على النحو التالي:

httpd = SocketServer.ThreadingTCPServer(('localhost', port), CustomHandler, False) # Do not automatically bind
httpd.allow_reuse_address = True # Prevent 'cannot bind to address' errors on restart
httpd.server_bind()     # Manually bind, to support allow_reuse_address
httpd.server_activate() # (see above comment)
httpd.serve_forever()

على أي حال ، يعتقد أن هذا قد يكون مفيدًا. سيختلف الحل قليلاً في بيثون 3.0

نصائح أخرى

الحل أعلاه لم ينجح بالنسبة لي ولكن هذا الحول فعل:

   SocketServer.ThreadingTCPServer.allow_reuse_address = True
   server = SocketServer.ThreadingTCPServer(("localhost", port), CustomHandler)
   server.serve_forever()
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top