2013-07-23 5 views
5

मैं क्लाइंट को चुनिंदा() फ़ंक्शन से डिस्कनेक्ट होने पर पता लगाने की कोशिश कर रहा हूं। समस्या यह है कि, मुझे काफी समझ में नहीं आता कि कैसे() काम करता है। मैं निम्नलिखित कोड का उपयोग कर रहा हूं, क्या आप मुझे बता सकते हैं कि मैं क्या गलत कर रहा हूं और/या क्लाइंट डिस्कनेक्ट होने पर कैसे पता लगाया जाए? मैं गैर-अवरुद्ध सॉकेट का उपयोग कर रहा हूं।चयन करते समय सॉकेट डिस्कनेक्ट होने पर पता लगाना()

int Network::bytesAvailable() 
{ 
    long bytes = 0; 

    if(ioctl(this->sockfd, FIONREAD, &bytes) < 0) 
    { 
     printf("ERROR: Network:bytesAvailable: ioctl() call failed.\n"); 
     return -1; 
    } 

    return bytes; 
} 

NetworkStatus Network::status() 
{ 
    struct timeval tv; 
    fd_set fd; 
    int result = 0; 

    tv.tv_sec = 5; 
    tv.tv_usec = 0; 

    FD_ZERO(&fd); 
    FD_SET(this->sockfd, &fd); 

    result = select(this->sockfd + 1, &fd, 0, 0, &tv); 

    if(result && !this->bytesAvailable()) 
    { 
     return -1; // disconnected, I'm guessing this is definitely WRONG. 
    } 
    else if(result > 0 && FD_ISSET(this->sockfd, &fd)) 
    { 
     return 1; // bytes available. 
    } 
    else if(!result) 
    { 
     return 0; // timeout 
    } 

    return -1; // select() call failed. 
} 
+0

आम तौर पर हम पता लगाने, कनेक्शन रहते हैं? 'keepalive' और 'select()' का उपयोग करके हम मल्टीप्लेक्सिंग के लिए उपयोग करते हैं। क्या यह ** ** सही नहीं है? –

+0

मैं आपके व्याकरण को समझ नहीं पा रहा हूं, मुझे क्षमा करें :) – user2399415

+0

क्षमा करें मेरी अंग्रेजी बहुत खराब है :(लेकिन मैंने टिप्पणी संपादित की, क्या अब मैं समझ गया हूं? –

उत्तर

8

जब एक सॉकेट बंद कर देता है यह "पठनीय" हो जाता है लेकिन बुला recv 0 बाइट्स वापस आ जाएगी। select का उपयोग करके आप बता सकते हैं कि सॉकेट को कब पढ़ा जा सकता है, तो इसे पढ़ने पर recv 0 देता है तो आपको पता है कि यह बंद हो गया है।

आपकी टिप्पणी "बाइट्स उपलब्ध" वास्तव में सही नहीं है। हालांकि, सॉकेट को पढ़ा जा सकता है, अगर यह बंद है तो कोई बाइट उपलब्ध नहीं होगा।

else if(result > 0 && FD_ISSET(this->sockfd, &fd)) 
{ 
    return 1; // bytes available. 
} 

गैर अवरुद्ध सॉकेट में, recv वापस आ जाएगी -1 और EWOULDBLOCK (या EAGAIN) को errno सेट कोई डेटा नहीं है और सॉकेट बंद नहीं है यदि।

+0

गैर-अवरुद्ध सॉकेट पर AFAIK , यह सही नहीं है, क्योंकि आरईवी 0 वापस कर सकता है (अभी तक कोई डेटा प्राप्त नहीं हुआ है)। – user2399415

+0

गैर-अवरुद्ध सॉकेट के संबंध में मेरे संपादन की जांच करें। –

+0

धन्यवाद। समस्या सुलझ गयी। – user2399415

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