2010-02-16 11 views
10

cannot-bind-to-address-after-socket-program-crashes लिए एक अनुवर्ती के रूप में, मैं यह संदेश मिल रहा था पता करने के लिए बाध्य कर सकते हैं नहीं के बाद मेरे कार्यक्रम दोबारा शुरू किए सीधे, कार्यक्रम अपने स्वयं के थ्रेडेड टीसीपी सर्वर शुरू कर रहा है:SocketServer.ThreadingTCPServer कार्यक्रम पुनः प्रारंभ करने पर

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

मैं इस त्रुटि संदेश को कैसे ठीक कर सकता हूं?

उत्तर

11

इस विशेष मामले में, .setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) को टीसीपीएस सर्वर क्लास से कॉल किया जा सकता है जब 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

+0

यह एक मेरे लिए काम किया लेकिन इसके बाद के संस्करण नहीं! धन्यवाद। –

16

ऊपर समाधान मेरे लिए काम नहीं किया में थोड़ा भिन्न होगा, लेकिन यह एक किया:

SocketServer.ThreadingTCPServer.allow_reuse_address = True 
    server = SocketServer.ThreadingTCPServer(("localhost", port), CustomHandler) 
    server.serve_forever() 
+0

दिलचस्प, आप पाइथन का किस संस्करण का उपयोग कर रहे हैं? मैक ओएसएक्स के तहत –

+0

2.6.1। – Lynn

+0

वही काम करता है, यह काम करता है लेकिन httpd.server_bind() पायथन 2.6.5 – rombarcz

संबंधित मुद्दे