2009-01-09 14 views
6

अगर मैं खोलने के लिए और उदाहरणक्या लिनक्स प्लेटफ़ॉर्म पर सॉकेट का उपयोग करते समय कोई फ़ाइल डिस्क्रिप्टर रिसाव है?

Socket s = new Socket(...); 
s.setReuseAddress(true); 
in = s.getInputStream(); 
... 
in.close(); 
s.close();  

के लिए बुला लिनक्स से एक सॉकेट बंद कहा गया है कि इस सॉकेट अभी भी खुला है या कम से कम कनेक्शन के लिए फ़ाइल वर्णनकर्ता presen है।

COMMAND PID USER FD TYPE DEVICE  SIZE NODE NAME 
java 9268 user 5u sock 0,4   93417 can't identify protocol 

इस प्रविष्टि बनी हुई है जब तक कार्यक्रम बंद कर दिया है: जब lsof द्वारा इस प्रक्रिया के लिए खुली फ़ाइलों की क्वेरी, वहाँ बंद कनेक्शन के लिए एक प्रवेश है। अंततः सॉकेट को बंद करने का कोई और तरीका है? मैं थोड़ा चिंतित हूं कि मेरा जावा एप्लिकेशन कई फ़ाइल डिस्क्रिप्टरों को अवरुद्ध कर सकता है। क्या यह संभव है? या जावा इन सॉकेट को फिर से उपयोग करने के लिए रखता है, यहां तक ​​कि ReuseAdress सेट है?

उत्तर

5

यदि वे सॉकेट TIME_WAIT स्थिति में हैं, तो कम से कम थोड़ी देर के लिए यह सामान्य है। नेटस्टैट के साथ जांचें; यह सुनिश्चित करने के लिए सॉकेट से कुछ मिनट तक लटकना आम बात है कि सॉकेट से घूमने वाले डेटा को नई सॉकेट के लिए बंदरगाह का पुन: उपयोग करने से पहले सफलतापूर्वक फेंक दिया जाता है।

+0

सहमत - यह जांच करने वाली पहली बात है। और कुछ मिनटों के बाद, आपके प्रोग्राम को अनिवार्य रूप से समाप्त होने से पहले, सॉकेट को दूर जाना चाहिए। –

+0

लेखक कहता है कि कार्यक्रम बंद होने तक प्रविष्टियां बनी रहती हैं, हालांकि मुझे लगता है कि वह निर्दिष्ट नहीं करता है कि यह कुछ मिनट से अधिक है या नहीं। –

+0

हाँ, मैंने देखा कि "कार्यक्रम बंद हो गया है", लेकिन यह सुनिश्चित नहीं था। –

0

शायद यह किसी अन्य प्रोटोकॉल की सॉकेट है ("प्रोटोकॉल की पहचान नहीं कर सकता" एएच?) कुछ ऐसा करने के लिए आंतरिक रूप से कार्यान्वित किया जाता है, जो पहली सॉकेट पर बनता है।

क्या आपने बार-बार सॉकेट बनाने और उन्हें बंद करने की कोशिश की है, यह देखने के लिए कि क्या ये सॉकेट वास्तव में बने रहते हैं? ऐसा लगता है कि यह एक बंद है।

जावा शायद कई चीजों के लिए आंतरिक रूप से सॉकेट का उपयोग करता है - वे यूनिक्स, नेटलिंक (लिनक्स के तहत) या किसी अन्य प्रकार की सॉकेट हो सकते हैं।

0

किसी निश्चित ऐप या पिड के लिए खोले सॉकेट की निगरानी करने के लिए एक छोटी बैश स्क्रिप्ट बनाएं, और अपने जावा ऐप का परीक्षण करते समय इसे चलाने दें।

मैं वैसे भी शक है इस बात में लीक के किसी भी प्रकार के रूप में देखते हैं कि सॉकेट बहुत लिनक्स/यूनिक्स दुनिया में इस्तेमाल कर रहे हैं इस तरह की समस्या होगा बबल सामने बहुत quicky

3

तुम भी /proc/<pid>/fd जाँच करना चाहते हो सकता है, निर्देशिका में आपके सभी वर्तमान में खोले गए फाइल डिस्क्रिप्टर होंगे। यदि सॉकेट बंद करने के बाद कोई फ़ाइल गायब हो जाती है तो आप किसी भी समस्या में नहीं भागेंगे (कम से कम आपके फ़ाइल वर्णनकर्ताओं के साथ नहीं :)।

1

मुझे लगता है कि यह आपके प्रोग्राम की समस्या नहीं है।

SUN_Java में, जब सॉकेट से संबंधित देशी lib लोड हो जाता है, तो एक मैजिक_SOCK fd बनाया जाएगा।

मैजिक_SOCK पर लिखने के लिए कनेक्ट रेस्ट अपवाद होगा, और मैजिक_SOCK पर पढ़ने के परिणामस्वरूप ईओएफ होगा।

जादू_सॉक का सहकर्मी पूरी तरह से बंद कर दिया गया है, और magic_sock स्वयं आधा_क्लोज्ड है, और राज्य "प्रोटोकॉल की पहचान नहीं कर सकता" रहेगा।

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