2012-08-27 24 views
5

मैं पाइथन के साथ खेल रहा हूं और किसी दिए गए बंदरगाह पर यूडीपी पैकेट सुन रहा हूं, सबकुछ अच्छी तरह से काम कर रहा है - लेकिन विस्तारित अवधि के बाद स्क्रिप्ट निम्न त्रुटि के साथ दुर्घटनाग्रस्त हो जाती है:पायथन 'कनेक्शन पीयर द्वारा रीसेट'

data = self._sock.recv(self._rbufsize) 
socket.error: [Errno 54] Connection reset by peer 

केवल स्क्रिप्ट को पुनरारंभ करते समय, एक ही क्रैश एक छोटी अवधि के बाद फिर से होता है। सर्वर को पुनरारंभ करने के बजाय समस्या को पूरी तरह से हल करने के लिए लगता है।

चीजों की सॉकेट पक्ष के संबंध में, मैं कर रहा हूँ:

UDP_IP = "0.0.0.0" 
UDP_PORT = 6000 

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
sock.bind((UDP_IP, UDP_PORT)) 

मैं कुछ स्पष्ट याद आ रही हूँ या वहाँ सिर्फ इस से बचने का एक आसान तरीका है?

किसी भी प्रकाश के लिए अग्रिम धन्यवाद!

बेंजी

उत्तर

5

त्रुटि UDP सॉकेट पर "सहकर्मी से कनेक्शन रीसेट", इसका मतलब है ग्राहक एक ICMP त्रुटि संदेश प्राप्त हुआ (उदाहरण के लिए: बंदरगाह पहुंच योग्य नहीं, टीटीएल को पार कर, आदि) है एक पैकेट पर सर्वर से यह भेजा गया है।

मैं क्या अपने कोड में यह खड़ी कर रहा है यकीन है के लिए नहीं कह सकता, लेकिन मैं दो विचारों की पेशकश कर सकते हैं:

  1. कनेक्शन वास्तव में कुछ के द्वारा बाधित किया गया था (रूटिंग समस्या, सर्वर साइड विफलता, आदि) । इस मामले में, आप इस त्रुटि की जांच कर सकते हैं, और यदि और जब ऐसा होता है तो आप अपनी सॉकेट को फिर से खोल सकते हैं।
  2. मुझे और अधिक संभावित लगता है, लेकिन मैं कम परिचित हूं, SO_REUSEADDR समस्या पैदा कर रहा है। यह सॉकेट विकल्प आपको उसी पोर्ट पर एकाधिक सॉकेट खोलने देता है। संभवतः होता है, यह है कि कुछ अन्य प्रक्रिया पोर्ट 6000 का उपयोग करने की कोशिश कर रही है, सफल होता है (क्योंकि आप ओएस को इसे अवरुद्ध नहीं करते हैं), और आपकी सॉकेट ओएस द्वारा बंद है। चूंकि मुझे यूडीपी सॉकेट पर SO_REUSEADDR का उपयोग करने का कोई कारण नहीं दिख रहा है, इसलिए मैं सुझाव दूंगा कि आप sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) लाइन को हटा दें और पुनः प्रयास करें।

शुभकामनाएँ!

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