2013-06-12 10 views
5

मैं अपने सॉकेट को गैर-अवरुद्ध करने के लिए ioctlsocket() फ़ंक्शन का उपयोग कर रहा हूं लेकिन जब मैं recvfrom() को कॉल करता हूं, तो मुझे त्रुटि 10035 (WSAEWOULDBLOCK) मिलती है।recvfrom() त्रुटि 10035 गैर-अवरुद्ध सॉकेट का उपयोग कर

u_long mode = 1; 
ioctlsocket(newSocketIdentifier, FIONBIO, &mode); 

while(1) 
    { 
     if((recv_len = recvfrom(newSocketIdentifier, receiveBuffer, sizeof(receiveBuffer), 0, (struct sockaddr *) &clientSocket, &clientSocketLength)) == SOCKET_ERROR) 
     { 
     char err[128]; 
     itoa(WSAGetLastError(),err,10); 
     MessageBox(NULL,"Could not Receive Data",err,MB_ICONINFORMATION); 
     BREAK; 
     } 
    } 

क्या कोई यह समझा सकता है कि ऐसा क्यों होता है? :(

+0

I/O कॉल विफल हो सकते हैं। क्या आप वाकई * सफल * सॉकेट को गैर-अवरुद्ध बनाने के रूप में सफल हैं? – unwind

+1

यदि वर्तमान में कोई डेटा उपलब्ध नहीं है तो आपको गैर-अवरुद्ध सॉकेट पर WSAEWOULDBLOCK मिल जाएगा। यह सामान्य व्यवहार है। –

उत्तर

10

यह अगर कोई डेटा उपलब्ध नहीं है सामान्य है। कोड WSAEWOULDBLOCK (यह तालिका देखें) और साधन है, कि एक अवरुद्ध बंदरगाह पर समारोह बैठने के लिए और इंतजार जब तक यह कार्य किया जा सकता है करना होगा।

while(1) 
    { 
     if((recv_len = recvfrom(newSocketIdentifier, receiveBuffer, sizeof(receiveBuffer), 0, (struct sockaddr *) &clientSocket, &clientSocketLength)) == SOCKET_ERROR) 
     { 
     int ierr= WSAGetLastError(); 
     if (ierr==WSAEWOULDBLOCK) { // currently no data available 
      Sleep(50); // wait and try again 
      continue; 
     } 

     // Other errors 
     char err[128]; 
     itoa(ierr,err,10); 
     MessageBox(NULL,"Could not Receive Data",err,MB_ICONINFORMATION); 
     break; 
     } 
    } 
+0

धन्यवाद प्रतिक्रिया के लिए, लेकिन मैं क्लाइंट लगातार टेक्स्ट फ़ाइल से डेटा पढ़ रहा हूं और सॉकेट पर भेज रहा हूं, फिर पढ़ने के लिए कोई डेटा उपलब्ध नहीं है? :( – Ayse

+0

आपके जैसे कोई छोटा लूप पैकेट्स एआर से तेज़ होगा नेटवर्क पर iving। यदि आपको WSAEWOULDBLOCK मिलता है तो बस अपने पाश को कुछ मिलीसेकंड (उदा। नींद (50)) के लिए सोने के लिए रखें और जारी रखें। – Grezgory

+0

बहुत बहुत धन्यवाद। अब यह स्लीप() एस के साथ काम कर रहा है, लेकिन क्या आपको लगता है कि यह एक अच्छा दृष्टिकोण है? शुरुआत में मैं WSAWaitforMultipleEvents() को केवल तब से कॉल करने के लिए कॉल कर रहा था जब FD_READ ईवेंट उपलब्ध हो गया था। मैंने सोचा कि यह गैर-अवरुद्ध सॉकेट के समान था लेकिन फिर किसी ने मुझे ioctlsocket() का उपयोग करने का विचार दिया। – Ayse

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