2012-11-25 14 views
11

मैं एक विश्वसनीय यूडीपी प्रोटोकॉल को लागू करने के लिए सी सॉकेट का उपयोग कर रहा हूं। मैं सॉकेट पर टाइमआउट सेट करने के लिए निम्न कोड का उपयोग कर रहा हूं जिसमें मैं एक पावती की प्रतीक्षा कर रहा हूं। मुझे यकीन नहीं है कि मुझे त्रुटि 11 क्यों मिल रही है, संसाधन अस्थायी रूप से अनुपलब्ध है।एरर्नो: 11, संसाधन अस्थायी रूप से अनुपलब्ध

 //set timer for recv_socket 
     struct timeval tv; 
     tv.tv_usec = TIMEOUT_MS; 

     if(setsockopt(rcv_sock, SOL_SOCKET, SO_RCVTIMEO,&tv,sizeof(tv)) < 0){ 
      printf("Error setting the socket timeout.\n"); 
     } 

     int recv_msg_len; 
     if(recv_msg_len = recvfrom(rcv_sock, ackBuffer,sizeof(ackBuffer), 0, 
       (struct sockaddr *) &servAddr2, &fromSize) < 0){ 
      //timeout reached 
      printf("Error Reporting: %d : %s\n", errno, strerror(errno)); 
      num_timeouts++; 
     } 

मैंने टिप्पणियों में वर्णित चुनिंदा विधि का भी प्रयास किया है। मेरे पास एक लूप के अंदर निम्न कोड है, लेकिन रिकॉर्म्स कभी खत्म नहीं होता है।

 fd_set set; 
     FD_ZERO(&set);  /* empties the set */ 
     FD_CLR(rcv_sock,&set); /* removes FD from the set */ 
     FD_SET(rcv_sock,&set); /* adds FD to the set */ 

     if(select(rcv_sock + 1, &set, NULL, NULL, &tv) < 0){ 
      printf("\nError Reporting: %d : %s\n\n", errno, strerror(errno)); 
      return -1; 
     } 


     if(!FD_ISSET(rcv_sock,&set)){ /* true if FD is in the set */ 
      printf("socket is not set properly.\n"); 
     } 
+0

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

+0

'snvfrom()' int वह दूसरा स्निपेट करने के लिए कोई कॉल नहीं है। – alk

+0

'recvfrom()' रिटर्न 'ssize_t' नहीं 'int', बीटीडब्ल्यू। – alk

उत्तर

13

जब एक अवरुद्ध सॉकेट पर recvfrom() और एक समय के लिए बाहर setsockopt() का उपयोग कर इसे recvfrom() का समय समाप्त करने के लिए कॉल (जो है मामले में त्रुटि EAGAIN (11) प्राप्त करने के लिए सामान्य है स्थापना की गई थी बुला: कोई डेटा समय में प्राप्त किया गया था अवधि के रूप में निर्दिष्ट अवधि)।

man recvfrom से शब्दशः:

वापसी मान

...

त्रुटियों

... ।

EAGAIN या EWOULDBLOCK सॉकेट nonblocking चिह्नित है और प्राप्त आपरेशन ब्लॉक कर देगा, या प्राप्त टाइमआउट स्थापना की गई थी और इससे पहले कि डेटा प्राप्त किया गया था टाइमआउट समाप्त हो गई है। ...

इस के आसपास पाने के लिए:

+1

बहुत बढ़िया जवाब! धन्यवाद! – rharrison33

0

मेरे लिए बस recvfrom() फिर से फोन ... ;-), समस्या एक विशेष बंदरगाह के लिए बाध्य UDP सॉकेट पर आ IPv6 पैकेट के कारण था। ये चयन() को ट्रिगर कर रहे थे, लेकिन जब मैंने recvfrom() का उपयोग करके उन्हें पढ़ने की कोशिश की तो कॉल "अस्थायी रूप से अनुपलब्ध" संसाधन लौटा। मुझे अपने आवेदन के लिए आईपीवी 6 की आवश्यकता नहीं है इसलिए मैंने इसे sysctl.conf के माध्यम से अक्षम कर दिया। समस्या अब चली गई!

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

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