2013-02-13 17 views
9

मेरे पास एक क्लाइंट सर्वर आर्किटेक्चर है जो कि अजगर में लिखा गया है। अधिकांश बार यह ठीक काम करता है, लेकिन कभी-कभी, जब मैं सर्वर को रोकता हूं और तुरंत इसे पुनरारंभ करता हूं, तो मुझे निम्न त्रुटि मिलती है:socket.accept() में अमान्य तर्क अपवाद अगर मैं पिछले रन के तुरंत बाद पुनरारंभ करता हूं

स्वीकृति के कारण विफल: 22 संदेश अमान्य तर्क, त्रुटि: [Errno 22] अमान्य तर्क

हालांकि, अगर मैं कुछ मिनट इंतजार करता हूं और एक ही स्क्रिप्ट को फिर से शुरू नहीं करता है तो यह ठीक काम करता है।

यह वह जगह है पाश मैं सर्वर पर का उपयोग क्लाइंट के इनकमिंग कनेक्शन स्वीकार करने के लिए:

try: 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    s.bind(('',port)) 
    s.listen(1) 
except: 
    #logError() 

while True: 
    try: 
     conn, address = s.accept() #THIS ACCEPT FAILS SOMETIMES 
     multiprocessing.Process(target=HandleConnection, args=(conn, address, messageQueue, taskQueue, IOLock, numberOfConnections, numberOfConnectionsLock,resultsDirectory)).start() 
    except socket.error, msg: 
     #logError() -> this except catches the error 

बंदरगाह कुछ समय के लिए अवरुद्ध हो करता है के बाद मैं सर्वर चलाते? यदि हां, तो क्या पोर्ट से अवरुद्ध होने पर पूछताछ करने का कोई तरीका है और जब तक मैं इसे छोड़ने के तुरंत बाद सर्वर को फिर से शुरू करना चाहता हूं, तब तक अनब्लॉक होने तक प्रतीक्षा करें?

उत्तर

7

आपको बाध्यकारी से पहले SO_REUSEADDR सेट करने की आवश्यकता है।

setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 

ऐसा करने के लिए बंधन से सॉकेट रोकने जा सकता है और, इस प्रकार त्रुटि accept आईएनजी। यदि आपने पहले ब्लॉक में अपवादों को दबाया नहीं है तो आपने यह त्रुटि देखी होगी।

+0

मैं अपवाद को चौंकाने वाला नहीं था, मैं इसे लॉगिंग कर रहा था, लेकिन मुझे लगता है कि मुझे इसके बाद वापस आना चाहिए था। इसके बजाय मैं थोड़ी देर लूप में गया, जिसने मेरे लॉग को कचरे से भर दिया और मैंने सोचा कि स्वीकार करने के साथ कोई मुद्दा नहीं था और बाध्य नहीं था। निराशा होती। – Alexander

+0

@Alexander ओह मैं देखता हूँ। क्षमा करें अगर मेरी टिप्पणी snarky लग रहा है, तो यह कई अन्य लोगों के साथ एक चेतावनी याद करने के लिए पूरी तरह से समझ में आता है। – cnicutar

+0

हाँ, मुझे लगता है कि मैं डाउनवॉट हो गया था और मैं 'ओमग' की तरह था, मैं एक बेवकूफ सवाल पूछने की कोशिश नहीं कर रहा हूं, मैं अब घंटों तक रहा हूं। आपकी सहायता के लिए बहुत - बहुत धन्यवाद। – Alexander