जुर्राब भेजने () आदेश पर एक "संसाधन अस्थायी रूप से अनुपलब्ध" का क्या कारण हो सकता है


85

Resource temporarily unavailableसॉकेट send()कमांड पर क्या त्रुटि हो सकती है ? सॉकेट सेटअप के रूप में है AF_UNIX, SOCK_STREAM। यह ज्यादातर समय काम करता है, लेकिन कभी-कभी यह त्रुटि हो जाती है। सॉकेट का प्राप्त अंत ठीक से काम करता प्रतीत होता है।

मुझे पता है कि यह बहुत विस्तृत नहीं है, लेकिन मैं सिर्फ सामान्य विचारों की तलाश कर रहा हूं। धन्यवाद!


क्या यह संबंधित है? stackoverflow.com/questions/5737493/…
धान

4
क्या आप अपना सॉकेट O_NONBLOCK पर सेट कर रहे हैं?
दीपंकर बाजपेयी

मुझे नहीं लगता कि यह उस पद से संबंधित है। मेरी सॉकेट्स SOCK_STREAM हैं, जो मेरा मानना ​​है कि जो मैं चाहता हूं उसे रोक रहा हूं।
जिरोय

3
क्या कोई स्ट्रीम अवरुद्ध है या गैर-ब्लॉकिंग स्वतंत्र है, चाहे वह SOCK_STREAM हो या SOCK_DGRAM। वहां का उत्तर प्रासंगिक है।
बारमर १ar

जवाबों:


96

"Resource temporarily unavailable"के अनुरूप त्रुटि संदेश है EAGAIN, जिसका अर्थ है कि ऑपरेशन अवरुद्ध हो गया होगा लेकिन नॉनब्लॉकिंग ऑपरेशन का अनुरोध किया गया था। के लिए send(), कि के किसी भी कारण हो सकता है:

  • स्पष्ट रूप से फाइल डिस्क्रिप्टर को नॉनब्लॉकिंग के रूप में चिह्नित करना fcntl(); या
  • MSG_DONTWAITध्वज को पास करना send(); या
  • SO_SNDTIMEOसॉकेट ऑप्शन के साथ सेंड टाइमआउट सेट करना ।

मेरी समस्या का कारण भेजें समयबाह्य था। मदद के लिए शुक्रिया!
22

@caf, मेरे मामले में, दो साइड में अलग-अलग MTU साइज़ कॉन्फ़िगरेशन के कारण sctp एसोसिएशन Txqueue ओवरफ्लो हो रहा था जब पैकेट विनिमय की उच्च दर हो रही थी। दोनों प्रणाली पर एक ही MTU बनाने से समस्या दूर हो गई। लेकिन क्या कोई यह बता सकता है कि समस्या के पीछे क्या कारण है?
कोडनमे_जेड

46

ऐसा इसलिए है क्योंकि आप non-blockingसॉकेट का उपयोग कर रहे हैं और आउटपुट बफर भरा हुआ है।

से send()आदमी पेज

EAGAIN "संसाधन अस्थायी रूप से अनुपलब्ध" से बंधा त्रुटि कोड है

select()इस व्यवहार का बेहतर नियंत्रण पाने के लिए उपयोग करने पर विचार करें


@giroy: लेकिन वास्तव में सही नहीं ... वास्तव में एक अवरुद्ध सॉकेट,SO_SNDTIMEO
EML

कूल लेकिन डीबी में एक साथ पढ़ने के लिए हम अन्य कनेक्शन का उपयोग कैसे कर सकते हैं?
MUY बेल्जियम

10

मुझे एक उदाहरण दें:

  1. क्लाइंट सर्वर से कनेक्ट होता है, और हर 1 सेकंड में सर्वर को 1MB डेटा भेजता है।

  2. सर्वर साइड एक कनेक्शन स्वीकार करते हैं, और फिर tcp send bufferक्लाइंट से पुन: संदेश के बिना 20 सेकंड सोते हैं । ग्राहक पक्ष में पूर्ण हो जाएगा।

ग्राहक पक्ष में कोड:

सर्वर साइड में कोड:

सर्वर साइड शुरू करें, फिर क्लाइंट साइड शुरू करें।

सर्वर साइड आउटपुट हो सकता है:

यहां छवि विवरण दर्ज करें

ग्राहक पक्ष उत्पादन कर सकते हैं:

यहां छवि विवरण दर्ज करें

आप देख सकते हैं, क्योंकि सर्वर साइड क्लाइंट से डेटा रिकवर नहीं करता है, इसलिए जब क्लाइंट साइड tcp bufferफुल हो जाता है, लेकिन आप अभी भी डेटा भेजते हैं, तो आपको Resource temporarily unavailableत्रुटि मिल सकती है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.