2012-12-12 22 views
5

है, मैं एक सॉकेट पर एक गैर-अवरुद्ध प्रेषण कॉल कर रहा हूं और अगली सॉकेट पर एक ब्लॉकिंग प्राप्त कर रहा हूं। उसके बाद मैं यह जांचना चाहता हूं कि गैर-अवरुद्ध भेजने में सफल या विफल रहा है या नहीं। यह कैसे किया जा सकता है?जांचें कि क्या गैर-अवरुद्ध भेजने में

while (i) 
    { 
     retval = send (out_sd, s_message, strlen (s_message), MSG_DONTWAIT); 
     retval = recv (client_sd, r_message, MSG_LEN, 0); 
     r_message[retval] = '\0'; 
     /* Here I want to wait for the non-blocking send to complete */ 
     strcpy (s_message, r_message); 
     strcpy (r_message, ""); 
     i--; 
    } 
+0

क्या कॉल-बैक का उपयोग करना संभव है? – andre

+1

मुझे ऐसा नहीं लगता है। अगली पुनरावृत्ति दर्ज करने से पहले, यह जांचने की आवश्यकता है कि संदेश भेजने में विफल रहा या सफल हुआ या कतारबद्ध किया गया था या नहीं। – phoxis

+0

भेजने/आरआरवी के परिणामों को स्टोर करने के लिए दो अलग-अलग var/s का उपयोग करें। – alk

उत्तर

5

आप किसी भी तरह मिश्रण कर रहे हैं सिंक्रोनस और एसिंक्रोनस आईओ, जो आम तौर पर एक सा भ्रामक है, लेकिन मैं यहाँ किसी भी व्यावहारिक समस्या नहीं दिख रहा।

हार्ड मतदान से बचने के लिए (जो यह देख रहा है कि आपका ऑपरेशन लूप में समाप्त हो गया है) तो आपको अपने चैनल/सॉकेट को अधिक लिखने के संचालन के लिए उपलब्ध होने के लिए एक चुनिंदा() का उपयोग करना चाहिए। यह आपको बताएगा कि पिछला एक समाप्त हो गया था (या यह कि आपके ओएस द्वारा पूरी तरह चार्ज किया गया था, जो वही है)।

चयन() फ़ंक्शन सी में एसिंक्रोनस आईओ के लिए आधार है, आपको इसके बारे में here में पढ़ना चाहिए, और this एक ऐसा उदाहरण है जो मुझे लगता है कि आपके लिए उपयोगी हो सकता है।

ध्यान दें कि चयन (लिखने और अपवाद घटनाओं का समर्थन करता है), उदाहरण एक पठन चयन दिखाता है, आप एक लेखन चयन करना चाहते हैं।

+0

हां मैंने मिश्रित सिंक्रोनस और एसिंक्रोनस I/O मिश्रित किया है, लेकिन विभिन्न सॉकेट में, मुझे लगता है कि यह ठीक काम करेगा। प्रत्येक प्रक्रिया कोड के इस बिट को निष्पादित करेगी, इसलिए यदि दोनों अवरुद्ध हो रहे हैं तो एक डेडलॉक होगा। इसलिए मैं पहले संदेश भेज रहा हूं, फिर प्राप्त करने की प्रतीक्षा कर रहा हूं। एक प्रक्रिया को डेटा प्राप्त करने के बाद, यह जांचना चाहिए कि अंतिम पुनरावृत्ति भेजने में आने से पहले अंतिम गैर-अवरुद्ध भेजने की सफलता थी या नहीं। – phoxis

+1

मुझे विवरण नहीं पता, लेकिन यदि दोनों सॉकेट एक ही 2 प्रोग्राम जोड़ता है, तो क्या आप वाकई सिंक्रोनस कॉल का उपयोग नहीं कर सकते हैं? कार्यक्रम की तरह ए पढ़ता है -> लिखना -> पढ़ें -> आदि, और प्रोग्राम बी लिखता है -> पढ़ें -> लिखें -> आदि। आमतौर पर यह किया जाता है, और इसमें कोई डेडलॉक नहीं होता है। –

+0

हां, जो पढ़ने और लिखने को बदलने की संभावना है, लेकिन मैं उस पहलू से बचना चाहता हूं। – phoxis

1

send() आपको त्रुटि के मामले में भेजे गए बाइट्स की संख्या या -1 वापस कर देगा।

यदि आपके संदेश से कम से कम कुछ बाइट भेजने के लिए नेटवर्क स्टैक में पर्याप्त बफर है, तो retval में भेजे गए बाइट्स की संख्या होगी, जो बाइट्स की संख्या से कम हो सकती है, जिन्हें आप भेजना चाहते हैं। यदि नेटवर्क स्टैक बफर भरा हुआ है, तो इसमें -1 और errnoEAGAIN या EWOULDBLOCK पर सेट हो जाएंगे।

सभी मामलों में, प्रेषण कॉल जितनी जल्दी हो सके पूरा हो जाता है। इसलिए आपको गैर-अवरुद्ध भेजने के लिए कहीं भी पूरा करने की प्रतीक्षा नहीं करनी है, आपको भेजने() कॉल रिटर्न के तुरंत बाद वापसी मूल्य की जांच करनी होगी।